# 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.

# to configure behavior, define $CQL_TEST_HOST to the destination address
# for Thrift connections, and $CQL_TEST_PORT to the associated port.

from .basecase import BaseTestCase

class TestCqlshInvocation(BaseTestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_normal_run(self):
        pass

    def test_python_interpreter_location(self):
        pass

    def test_color_capability_detection(self):
        pass

    def test_colored_output(self):
        pass

    def test_color_cmdline_option(self):
        pass

    def test_debug_option(self):
        pass

    def test_connection_args(self):
        pass

    def test_connection_config(self):
        pass

    def test_connection_envvars(self):
        pass

    def test_command_history(self):
        pass

    def test_missing_dependencies(self):
        pass

    def test_completekey_config(self):
        pass

    def test_ctrl_c(self):
        pass

    def test_eof(self):
        pass

    def test_output_encoding_detection(self):
        pass

    def test_output_encoding(self):
        pass

    def test_retries(self):
        pass
