/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.carbondata.spark.testsuite.createTable

import org.apache.spark.sql.test.util.QueryTest
import org.scalatest.BeforeAndAfterAll

/**
 * test functionality for create table with table comment
 */
class TestCreateTableWithTableComment extends QueryTest with BeforeAndAfterAll {

  override def beforeAll {
    sql("use default")
    sql("drop table if exists withTableComment")
    sql("drop table if exists withoutTableComment")
  }

  test("test create table with table comment") {
    sql(
      s"""
         | create table withTableComment(
         | id int,
         | name string
         | )
         | comment "This table has table comment"
         | STORED AS carbondata
       """.stripMargin
    )

    val result = sql("describe formatted withTableComment")

    checkExistence(result, true, "Comment")
    checkExistence(result, true, "This table has table comment")
  }

  test("test create table without table comment") {
    sql(
      s"""
         | create table withoutTableComment(
         | id int,
         | name string
         | )
         | STORED AS carbondata
       """.stripMargin
    )

    val result = sql("describe formatted withoutTableComment")

    checkExistence(result, true, "Comment")
    checkExistence(result, false, "This table has table comment")
  }

  override def afterAll: Unit = {
    sql("use default")
    sql("drop table if exists withTableComment")
    sql("drop table if exists withoutTableComment")
  }

}
