diff tests/test.py @ 656:2b1c7a68f913

Enable indexed access to lists in the configuration using an access path string representation like "~NNN~"
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 30 May 2022 09:31:29 +0200
parents fe1299825a9a
children 213f0ec3bbbc
line wrap: on
line diff
--- a/tests/test.py	Sun May 29 15:32:54 2022 +0200
+++ b/tests/test.py	Mon May 30 09:31:29 2022 +0200
@@ -944,7 +944,14 @@
                 i,
                 cfg.getvarl_s(u"test", u"List", i))
 
-    def test48_index_access_to_lists_with_subdicts(self):
+    def test48_indexed_access_to_lists(self):
+        cfg = self._load(os.path.join(TESTDATADIR, "conf20.yml"))
+        for i in range(4):
+            self.assertEqual(
+                i,
+                cfg.getvar_s(u"test.List.~%d~" % (i, )))
+
+    def test49_index_access_to_lists_with_subdicts(self):
         cfg = self._load(os.path.join(TESTDATADIR,
                                       "index-access-for-jails.yml"))
         for idx in range(len(cfg.getvarl(u"the-list"))):
@@ -952,6 +959,14 @@
                 idx,
                 cfg.getvarl_s(u"the-list", idx, u"entry"))
 
+    def test50_index_access_to_lists_with_subdicts(self):
+        cfg = self._load(os.path.join(TESTDATADIR,
+                                      "index-access-for-jails.yml"))
+        for idx in range(len(cfg.getvarl(u"the-list"))):
+            self.assertEqual(
+                idx,
+                cfg.getvar_s(u"the-list.~%d~.entry" % (idx, )))
+
 
 class T02LoadAndMerge(_T02MixinLoadAndMerge, unittest.TestCase):
 
@@ -1897,6 +1912,18 @@
             jcfg = cfg.jailed(rootpath=(u"the-list", idx))
             self.assertEqual(1, len(jcfg))
             self.assertEqual(idx, jcfg.getvarl_s(u"entry"))
+            self.assertEqual((u"the-list", idx), jcfg._path)
+            self.assertEqual(u"the-list.~%d~." % (idx, ), jcfg._pathstr)
+
+    def test_index_jail_access_with_strpath(self):
+        cfg = configmix.load(os.path.join(
+            TESTDATADIR, "index-access-for-jails.yml"))
+        for idx in range(len(cfg.getvarl(u"the-list"))):
+            jcfg = cfg.jailed(root=u"the-list.~%d~" % (idx, ))
+            self.assertEqual(1, len(jcfg))
+            self.assertEqual(idx, jcfg.getvarl_s(u"entry"))
+            self.assertEqual((u"the-list", idx), jcfg._path)
+            self.assertEqual(u"the-list.~%d~." % (idx, ), jcfg._pathstr)
 
 
 class _TParserMixin:
@@ -1906,13 +1933,13 @@
         self.assertEqual(u"", self.unquote(e))
 
     def test_quoting_and_unquoting_are_inverse(self):
-        for c in u"""%.:#|"'{}[]""":
+        for c in u"""%.:#|"'{}[]~""":
             qc = self.quote(c)
             self.assertTrue(qc.startswith(u"%x") and len(qc) == 4)
             self.assertEqual(c, self.unquote(qc))
 
     def test_quoting_and_unquoting_are_inverse_all(self):
-        c = u"""%.:#|"'{}[]"""
+        c = u"""%.:#|"'{}[]~"""
         qc = self.quote(c)
         self.assertEqual(len(c)*4, len(qc))
         self.assertEqual(c, self.unquote(qc))
@@ -1930,6 +1957,33 @@
         self.assertEqual(configmix.config._QUOTE_SAFE, qc)
         self.assertEqual(configmix.config._QUOTE_SAFE, self.unquote(qc))
 
+    def test_quote_index_to_tilde(self):
+        self.assertEqual(u"~4~", self.quote(4))
+
+    def test_unquote_index_with_tilde(self):
+        self.assertEqual(4, self.unquote(u"~4~"))
+
+    def test_unquote_empty_tilde(self):
+        self.assertEqual(u"~~", self.unquote(u"~~"))
+
+    def test_unquote_invalid_number_tilde(self):
+        self.assertEqual(u"~0x4~", self.unquote(u"~0x4~"))
+
+    def test_unquote_invalid_number_tilde_2(self):
+        self.assertEqual(u"~\U00019001~", self.unquote(u"~%U00019001~"))
+
+    def test_quote_unquote_indexes(self):
+        for idx in range(0, 10000):
+            self.assertEqual(idx, self.unquote(self.quote(idx)))
+
+    def test_quote_unquote_negative_index(self):
+        for idx in (-1, -2, -3):
+            self.assertEqual(idx, self.unquote(self.quote(idx)))
+
+    def test_index_overflow_border(self):
+        self.assertEqual(32759, self.unquote(u"~32759~"))
+        self.assertEqual(u"~32760~", self.unquote(u"~32760~"))
+
     def test_unquote_unimax(self):
         self.assertEqual(u"\U00019001", self.unquote(u"%U00019001"))
         self.assertEqual(u"X\U00019AF1Z", self.unquote(u"X%U00019aF1Z"))
@@ -2013,6 +2067,10 @@
         p = self.pathstr2path(u"a%x2Eb.c%u002Ed.e%U0000002Ef")
         self.assertEqual((u"a.b", u"c.d", u"e.f"), p)
 
+    def test_split_unquote_with_index(self):
+        p = self.pathstr2path(u"a%x2Eb.~555~.c%u002Ed.e%U0000002Ef.~6~")
+        self.assertEqual((u"a.b", 555, u"c.d", u"e.f", 6), p)
+
     def test_split_ns_empty(self):
         self.assertEqual((None, u""), self.split_ns(u""))
 
@@ -2243,7 +2301,7 @@
         self.assertRaises(
             AttributeError,    # no .lstrip
             self.quote,
-            1)
+            1.0)
 
     def test_unquote_wrong_type(self):
         self.assertRaises(