#!/usr/bin/env python
#
# Copyright 2017 Google Inc. All Rights Reserved.
#
# Licensed 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.
#
"""Tests the config module."""

import unittest

import config


class ConfigTest(unittest.TestCase):

  def testGetAll(self):
    config_names = config.GetAll()
    self.assertNotEqual(0, len(config_names))

  def testIsValid(self):
    config_names = config.GetAll()
    for config_name in config_names:
      self.assertTrue(config.IsValid(config_name))
      self.assertTrue(config.IsValid(config_name.lower()))
      self.assertFalse(config.IsValid(config_name.upper()))
    self.assertFalse(config.IsValid('invalidconfig'))


if __name__ == '__main__':
  unittest.main()
