+# -*- coding: utf-8 -*-
+
+from moe.status import Status, InvalidStatusFile
+import unittest
+import tempfile
+
+class TestStatus(unittest.TestCase):
+
+# def setUp(s):
+# s.st = st.Status()
+
+ def parse(s, string):
+ st = Status()
+ st.read(lines=string.split('\n'))
+ return st
+
+ def test_basic_read(s):
+ st = s.parse(""); assert(not st.d)
+ st = s.parse("\t\t \n \t a\t \t :\t b\t"); assert(st['a'] == '\t b\t')
+ st = s.parse("a:\t\n"); assert(st['a'] == '\t')
+ st = s.parse("\t\t \n \t a\t \t (\nb:\n)"); assert(st['a']['b'] == '')
+ st = s.parse("a(\nz:\n:\na(\na(\na(\na(\n)\n)\nx:y\n)\n)\n)")
+ assert(st['a']['a']['a']['x'] == 'y')
+ assert(st['a']['z'] == '\n')
+ s.assertRaises(InvalidStatusFile, s.parse, "a")
+ s.assertRaises(InvalidStatusFile, s.parse, "a\n(\n)")
+
+ def test_unique(s):
+ s.assertRaises(InvalidStatusFile, s.parse, "a:1\na:1")
+ s.assertRaises(InvalidStatusFile, s.parse, "a(\n)\na(\n)")
+ s.assertRaises(InvalidStatusFile, s.parse, "a(\n)\na:0")
+
+ def test_multiline(s):
+ s.assertRaises(InvalidStatusFile, s.parse, ":\na:b\n")
+ s.assertRaises(InvalidStatusFile, s.parse, "x:1\na(\n:\n)\n")
+ s.assertRaises(InvalidStatusFile, s.parse, "a(\na:b\n)\n:c")
+ # the continuation of entry must be at consecutive lines
+ s.assertRaises(InvalidStatusFile, s.parse, "a:\n:\n\n:z")
+ s.assertRaises(InvalidStatusFile, s.parse, "a:\n#\n:\n")
+ # Valid entries
+ st = s.parse("a:\t\n\t \t : \t\n:"); assert(st['a'] == '\t\n \t\n')
+ st = s.parse(" a : \n :x"); assert(st['a'] == ' \nx')
+ st = s.parse("a :\n :\n \t:"); assert(st['a'] == '\n\n')
+
+ def test_comments(s):
+ st = s.parse("#a:b"); assert(not st.d)
+ st = s.parse("a:b#c:d"); assert(st['a'] == 'b#c:d')
+ s.assertRaises(InvalidStatusFile, s.parse, "a( #comm\n)")
+ s.assertRaises(InvalidStatusFile, s.parse, "a(\n)#comm")
+
+ def test_file_utf8(s):
+ st = Status()
+ f = tempfile.TemporaryFile(mode='w+t')
+ f.write(u'a:ášďëå'.encode('utf8'))
+ f.seek(0)
+ st.read(f=f)
+ assert(st['a'] == '\xc3\xa1\xc5\xa1\xc4\x8f\xc3\xab\xc3\xa5')
+
+ def test_file_wr_eq_l2(s):
+ st = s.parse('a:' + u'ášďě'.encode('l2') + """
+ b(
+ c(
+ d:esdf
+ :frty
+ )
+ d:
+ x:
+ :
+ :
+ )
+ """)
+ f = tempfile.NamedTemporaryFile()
+ st.write(name = f.name)
+ st2 = Status()
+ st2.read(name = f.name)
+ assert(st['a'] == '\xe1\xb9\xef\xec')
+ print('\n'.join(st.dump()), '\n'.join(st2.dump()))
+ assert(st == st2)
+
+