#!/usr/bin/env python
# Copyright 2013, Big Switch Networks, Inc.
#
# LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
# the following special exception:
#
# LOXI Exception
#
# As a special exception to the terms of the EPL, you may distribute libraries
# generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
# that copyright and licensing notices generated by LoxiGen are not altered or removed
# from the LoxiGen Libraries and the notice provided below is (i) included in
# the LoxiGen Libraries, if distributed in source code form and (ii) included in any
# documentation for the LoxiGen Libraries, if distributed in binary form.
#
# Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
#
# You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
# a copy of the EPL at:
#
# http://www.eclipse.org/legal/epl-v10.html
#
# 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
# EPL for the specific language governing permissions and limitations
# under the EPL.

import unittest
import test_data

class DataFileTests(unittest.TestCase):
    def test_example(self):
        self.assertTrue('./example.data' in test_data.list_files())
        data = test_data.read('example.data')
        self.assertEquals(sorted(['section1', 'section2', 'binary']), sorted(data.keys()))
        self.assertEquals(' abc def\nghi', data['section1'])
        self.assertEquals('123\n456\n789', data['section2'])
        self.assertEquals('\x00\x01\x02\x03\x04\x05\x06\x07\x77\x66\x55\x44\x33\x22\x11\x00',
                          data['binary'])

    # Just make sure all included data files parse without exceptions
    def test_all(self):
        for name in test_data.list_files():
            test_data.read(name)

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