#!/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 as config_module


class ConfigTest(unittest.TestCase):

  def testGetAll(self):
    configs = config_module.GetAll()
    self.assertNotEqual(0, len(configs))

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

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