def testCorruptConfigIsReported(self):
        configPath = TESTROOT + '/existingconfig.yml'
        self.writeFile(configPath, 'br0ken')

        with self.assertRaisesRegex(IOError, r'\S+ seems to be corrupt, please check or delete file\.'):
            config = Config(configPath)
            config.load()
    def testCorruptValueIsReported(self):
        configPath = TESTROOT + '/existingconfig.yml'
        self.writeFile(configPath,
                       ('heuristics:\n'
                        '  activate: bla\n'))

        with self.assertRaisesRegex(IOError, r'\S+ seems to be corrupt, please check or delete file\.'):
            config = Config(configPath)
            config.load()
    def testMapsStringsToBool(self):
        configPath = TESTROOT + '/existingconfig.yml'
        self.writeFile(configPath,
                       ('heuristics:\n'
                        '  activate: ON\n'
                        '  authentic_shifting: False\n'))

        config = Config(configPath)
        config.load()

        self.assertTrue(config.heuristics_activated)
        self.assertFalse(config.authentic_shifting)
    def testExistingConfigIsMigrated(self):
        configPath = TESTROOT + '/existingconfig.yml'
        self.writeFile(configPath, 'ignored_user_entry: 123')

        config = Config(configPath)
        config.load()

        self.assertEqual(DEFAULT_CONFIG_COUNT + 1, len(config.keys()))
        self.assertEqual(DEFAULT_CONFIG_COUNT + 1, len(config.values()))
        self.assertEqual(config['speed_unit'], 'kph')
    def testExistingConfigIsMigrated(self):
        configPath = testroot + '/existingconfig.yml'
        self.writeFile(configPath, 'ignored_user_entry: 123')

        config = Config(configPath)
        config.load()

        self.assertEqual(default_config_count + 1, len(config.keys()))
        self.assertEqual(default_config_count + 1, len(config.values()))
        self.assertEqual(config['speed_unit'], 'kph')
    def testFreshConfigIsCreated(self):
        configPath = TESTROOT + '/newconfig.yml'

        if os.path.exists(configPath):
            os.remove(configPath)

        config = Config(configPath)
        config.load()

        self.assertEqual(DEFAULT_CONFIG_COUNT, len(config.keys()))
        self.assertEqual(DEFAULT_CONFIG_COUNT, len(config.values()))
        self.assertEqual(config['speed_unit'], 'kph')
    def testFreshConfigIsCreated(self):
        configPath = testroot + '/' + 'newconfig.yml'

        if os.path.exists(configPath):
            os.remove(configPath)

        config = Config(configPath)
        config.load()

        self.assertEqual(default_config_count, len(config.keys()))
        self.assertEqual(default_config_count, len(config.values()))
        self.assertEqual(config['speed_unit'], 'kph')
    def testExistingValuesAreKeptOrExtended(self):
        configPath = TESTROOT + '/existingconfig.yml'
        self.writeFile(configPath,
                    ('speed_unit: kph\n'
                     'telemetry_server:\n'
                     '  port: 12345'))

        config = Config(configPath)
        config.load()

        self.assertEqual(DEFAULT_CONFIG_COUNT, len(config.keys()))
        self.assertEqual(DEFAULT_CONFIG_COUNT, len(config.values()))
        self.assertEqual(config['speed_unit'], 'kph')
        self.assertEqual(config['telemetry_server']['port'], 12345)
        self.assertEqual(config['telemetry_server']['host'], '127.0.0.1')
        self.assertEqual(config['heuristics']['activate'], 0)
    def testValuesCanBeReadAsBool(self):
        configPath = TESTROOT + '/valuetest.yml'

        if os.path.exists(configPath):
            os.remove(configPath)

        config = Config(configPath)
        config.load()
        config.clear()

        config['val0'] = 0
        config['valFalse'] = False
        config['val1'] = 1
        config['valTrue'] = True

        self.assertFalse(config['val0'])
        self.assertFalse(config['valFalse'])
        self.assertTrue(config['val1'])
        self.assertTrue(config['valTrue'])