| # -*- coding: utf-8 -*- |
| |
| from __future__ import unicode_literals |
| |
| import os |
| import unittest |
| |
| from StringIO import StringIO |
| |
| import mozpack.path as mozpath |
| |
| from mozbuild.dotproperties import ( |
| DotProperties, |
| ) |
| |
| from mozunit import ( |
| main, |
| ) |
| |
| test_data_path = mozpath.abspath(mozpath.dirname(__file__)) |
| test_data_path = mozpath.join(test_data_path, 'data') |
| |
| |
| class TestDotProperties(unittest.TestCase): |
| def test_get(self): |
| contents = StringIO(''' |
| key=value |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get('missing'), None) |
| self.assertEqual(p.get('missing', 'default'), 'default') |
| self.assertEqual(p.get('key'), 'value') |
| |
| |
| def test_update(self): |
| contents = StringIO(''' |
| old=old value |
| key=value |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get('old'), 'old value') |
| self.assertEqual(p.get('key'), 'value') |
| |
| new_contents = StringIO(''' |
| key=new value |
| ''') |
| p.update(new_contents) |
| self.assertEqual(p.get('old'), 'old value') |
| self.assertEqual(p.get('key'), 'new value') |
| |
| |
| def test_get_list(self): |
| contents = StringIO(''' |
| list.0=A |
| list.1=B |
| list.2=C |
| |
| order.1=B |
| order.0=A |
| order.2=C |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get_list('missing'), []) |
| self.assertEqual(p.get_list('list'), ['A', 'B', 'C']) |
| self.assertEqual(p.get_list('order'), ['A', 'B', 'C']) |
| |
| |
| def test_get_list_with_shared_prefix(self): |
| contents = StringIO(''' |
| list.0=A |
| list.1=B |
| list.2=C |
| |
| list.sublist.1=E |
| list.sublist.0=D |
| list.sublist.2=F |
| |
| list.sublist.second.0=G |
| |
| list.other.0=H |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get_list('list'), ['A', 'B', 'C']) |
| self.assertEqual(p.get_list('list.sublist'), ['D', 'E', 'F']) |
| self.assertEqual(p.get_list('list.sublist.second'), ['G']) |
| self.assertEqual(p.get_list('list.other'), ['H']) |
| |
| |
| def test_get_dict(self): |
| contents = StringIO(''' |
| A.title=title A |
| |
| B.title=title B |
| B.url=url B |
| |
| C=value |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get_dict('missing'), {}) |
| self.assertEqual(p.get_dict('A'), {'title': 'title A'}) |
| self.assertEqual(p.get_dict('B'), {'title': 'title B', 'url': 'url B'}) |
| with self.assertRaises(ValueError): |
| p.get_dict('A', required_keys=['title', 'url']) |
| with self.assertRaises(ValueError): |
| p.get_dict('missing', required_keys=['key']) |
| # A key=value pair is considered to root an empty dict. |
| self.assertEqual(p.get_dict('C'), {}) |
| with self.assertRaises(ValueError): |
| p.get_dict('C', required_keys=['missing_key']) |
| |
| |
| def test_get_dict_with_shared_prefix(self): |
| contents = StringIO(''' |
| A.title=title A |
| A.subdict.title=title A subdict |
| |
| B.title=title B |
| B.url=url B |
| B.subdict.title=title B subdict |
| B.subdict.url=url B subdict |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get_dict('A'), {'title': 'title A'}) |
| self.assertEqual(p.get_dict('B'), {'title': 'title B', 'url': 'url B'}) |
| self.assertEqual(p.get_dict('A.subdict'), |
| {'title': 'title A subdict'}) |
| self.assertEqual(p.get_dict('B.subdict'), |
| {'title': 'title B subdict', 'url': 'url B subdict'}) |
| |
| def test_get_dict_with_value_prefix(self): |
| contents = StringIO(''' |
| A.default=A |
| A.default.B=B |
| A.default.B.ignored=B ignored |
| A.default.C=C |
| A.default.C.ignored=C ignored |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get('A.default'), 'A') |
| # This enumerates the properties. |
| self.assertEqual(p.get_dict('A.default'), {'B': 'B', 'C': 'C'}) |
| # They can still be fetched directly. |
| self.assertEqual(p.get('A.default.B'), 'B') |
| self.assertEqual(p.get('A.default.C'), 'C') |
| |
| |
| def test_unicode(self): |
| contents = StringIO(''' |
| # Danish. |
| # #### ~~ Søren Munk Skrøder, sskroeder - 2009-05-30 @ #mozmae |
| |
| # Korean. |
| A.title=한메일 |
| |
| # Russian. |
| list.0 = test |
| list.1 = Яндекс |
| ''') |
| p = DotProperties(contents) |
| self.assertEqual(p.get_dict('A'), {'title': '한메일'}) |
| self.assertEqual(p.get_list('list'), ['test', 'Яндекс']) |
| |
| def test_valid_unicode_from_file(self): |
| # The contents of valid.properties is identical to the contents of the |
| # test above. This specifically exercises reading from a file. |
| p = DotProperties(os.path.join(test_data_path, 'valid.properties')) |
| self.assertEqual(p.get_dict('A'), {'title': '한메일'}) |
| self.assertEqual(p.get_list('list'), ['test', 'Яндекс']) |
| |
| def test_bad_unicode_from_file(self): |
| # The contents of bad.properties is not valid Unicode; see the comments |
| # in the file itself for details. |
| with self.assertRaises(UnicodeDecodeError): |
| DotProperties(os.path.join(test_data_path, 'bad.properties')) |
| |
| |
| if __name__ == '__main__': |
| main() |