/*
 * 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 BY '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 BY '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")
  }

}
