From f4bc4c94767caf9beda5fa2a09e476ec0660dc4b Mon Sep 17 00:00:00 2001 From: qth2hi Date: Thu, 9 Jan 2025 18:59:59 +0100 Subject: [PATCH 1/3] Self test adapted to latest changes of the JsonPreprocessor --- test/JPP_TestUsecases.html | 14 +- test/JPP_TestUsecases.rst | 14 +- test/JPP_TestUsecases.txt | 14 +- test/component_test.py | 4 +- .../test_08_NAMING_CONVENTION_BADCASE.py | 14 +- test/testconfig/TestConfig.py | 224 ++++++++++-------- test/testfiles/jpp-test_config_0400.jsonp | 125 ++++++---- test/testfiles/jpp-test_config_0952.jsonp | 6 +- test/testtools/GenSnippetsJPP.py | 11 +- 9 files changed, 245 insertions(+), 181 deletions(-) diff --git a/test/JPP_TestUsecases.html b/test/JPP_TestUsecases.html index e9caa37b..081a64cd 100644 --- a/test/JPP_TestUsecases.html +++ b/test/JPP_TestUsecases.html @@ -2291,7 +2291,7 @@ JSON file with several invalid parameter names (1)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -2324,7 +2324,7 @@ JSON file with several invalid parameter names (2)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -2357,7 +2357,7 @@ JSON file with several invalid parameter names (3)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -2390,7 +2390,7 @@ JSON file with several invalid parameter names (4)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -2423,7 +2423,7 @@ JSON file with several invalid parameter names (5)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -2456,7 +2456,7 @@ JSON file with several invalid parameter names (6)
-Expected: All names are accepted (in definition and in reference) +Expected: Expected: No values are returned, and JsonPreprocessor throws an exception
@@ -6742,7 +6742,7 @@
 

-
Generated: 03.01.2025 - 16:19:20
+
Generated: 09.01.2025 - 18:56:30
 
diff --git a/test/JPP_TestUsecases.rst b/test/JPP_TestUsecases.rst index 49f7a098..4c4763eb 100644 --- a/test/JPP_TestUsecases.rst +++ b/test/JPP_TestUsecases.rst @@ -745,7 +745,7 @@ Test Use Cases **JSON file with several invalid parameter names (1)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -755,7 +755,7 @@ Test Use Cases **JSON file with several invalid parameter names (2)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -765,7 +765,7 @@ Test Use Cases **JSON file with several invalid parameter names (3)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -775,7 +775,7 @@ Test Use Cases **JSON file with several invalid parameter names (4)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -785,7 +785,7 @@ Test Use Cases **JSON file with several invalid parameter names (5)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -795,7 +795,7 @@ Test Use Cases **JSON file with several invalid parameter names (6)** - Expected: All names are accepted (in definition and in reference) + Expected: Expected: No values are returned, and JsonPreprocessor throws an exception ---- @@ -2125,5 +2125,5 @@ Test Use Cases ---- -Generated: 03.01.2025 - 16:19:20 +Generated: 09.01.2025 - 18:56:30 diff --git a/test/JPP_TestUsecases.txt b/test/JPP_TestUsecases.txt index e61f7f57..5886a31c 100644 --- a/test/JPP_TestUsecases.txt +++ b/test/JPP_TestUsecases.txt @@ -312,27 +312,27 @@ Expectation: All names are accepted (in definition and in reference) ------------------------------------------------------------------------------------------------------------------------ Test JPP_0450 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (1) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0451 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (2) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0452 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (3) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0453 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (4) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0454 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (5) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0455 / NAMING_CONVENTION / BADCASE Description: JSON file with several invalid parameter names (6) -Expectation: All names are accepted (in definition and in reference) +Expectation: Expected: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ Test JPP_0500 / COMPOSITE_EXPRESSIONS / GOODCASE Description: JSON file with composite data structure (nested lists and dictionaries 1) @@ -868,5 +868,5 @@ Test JPP_2058 / PARAMETER_SCOPE / BADCASE Description: JSON file containing a parameter with missing scope (9) Expectation: No values are returned, and JsonPreprocessor throws an exception ------------------------------------------------------------------------------------------------------------------------ -Generated: 03.01.2025 - 16:19:20 +Generated: 09.01.2025 - 18:56:30 diff --git a/test/component_test.py b/test/component_test.py index 92d1b7b2..1d89408a 100644 --- a/test/component_test.py +++ b/test/component_test.py @@ -22,8 +22,8 @@ # # -------------------------------------------------------------------------------------------------------------- # -VERSION = "0.56.0" -VERSION_DATE = "03.01.2025" +VERSION = "0.57.0" +VERSION_DATE = "09.01.2025" # # -------------------------------------------------------------------------------------------------------------- #TM*** diff --git a/test/pytest/pytestfiles/test_08_NAMING_CONVENTION_BADCASE.py b/test/pytest/pytestfiles/test_08_NAMING_CONVENTION_BADCASE.py index 7b3484b7..87eddff5 100644 --- a/test/pytest/pytestfiles/test_08_NAMING_CONVENTION_BADCASE.py +++ b/test/pytest/pytestfiles/test_08_NAMING_CONVENTION_BADCASE.py @@ -18,7 +18,7 @@ # # XC-HWP/ESW3-Queckenstedt # -# 28.10.2024 - 20:15:13 +# 09.01.2025 - 18:56:30 # # -------------------------------------------------------------------------------------------------------------- @@ -30,7 +30,7 @@ class Test_NAMING_CONVENTION_BADCASE: # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (1)",] ) @@ -38,7 +38,7 @@ def test_JPP_0450(self, Description): nReturn = CExecute.Execute("JPP_0450") assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (2)",] ) @@ -46,7 +46,7 @@ def test_JPP_0451(self, Description): nReturn = CExecute.Execute("JPP_0451") assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (3)",] ) @@ -54,7 +54,7 @@ def test_JPP_0452(self, Description): nReturn = CExecute.Execute("JPP_0452") assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (4)",] ) @@ -62,7 +62,7 @@ def test_JPP_0453(self, Description): nReturn = CExecute.Execute("JPP_0453") assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (5)",] ) @@ -70,7 +70,7 @@ def test_JPP_0454(self, Description): nReturn = CExecute.Execute("JPP_0454") assert nReturn == 0 # -------------------------------------------------------------------------------------------------------------- - # Expected: All names are accepted (in definition and in reference) + # Expected: Expected: No values are returned, and JsonPreprocessor throws an exception @pytest.mark.parametrize( "Description", ["JSON file with several invalid parameter names (6)",] ) diff --git a/test/testconfig/TestConfig.py b/test/testconfig/TestConfig.py index 5555c8f2..ea81551d 100644 --- a/test/testconfig/TestConfig.py +++ b/test/testconfig/TestConfig.py @@ -22,7 +22,7 @@ # # -------------------------------------------------------------------------------------------------------------- # -# 03.01.2025 +# 09.01.2025 # # !!! Temporarily tests are deactivated by the following line commented out: # # # listofdictUsecases.append(dictUsecase) @@ -1618,6 +1618,9 @@ # -------------------------------------------------------------------------------------------------------------- # -------------------------------------------------------------------------------------------------------------- dictUsecase = {} +# https://github.com/test-fullautomation/python-jsonpreprocessor/issues/406 +# 'invalid group reference 5 at position 9'! +# partially commented out dictUsecase['TESTID'] = "JPP_0400" dictUsecase['DESCRIPTION'] = "JSON file with several parameter names w.r.t. the naming convention" dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" @@ -1628,81 +1631,116 @@ dictUsecase['JSONFILE'] = r"..\testfiles\jpp-test_config_0400.jsonp" dictUsecase['EXPECTEDEXCEPTION'] = None dictUsecase['EXPECTEDRETURN'] = """ -[DOTDICT] (55/1) > {A} [INT] : 1 -[DOTDICT] (55/2) > {check01} [INT] : 1 -[DOTDICT] (55/3) > {_} [INT] : 3 -[DOTDICT] (55/4) > {check03} [INT] : 3 -[DOTDICT] (55/5) > {Ax} [INT] : 4 -[DOTDICT] (55/6) > {check04} [INT] : 4 -[DOTDICT] (55/7) > {0x} [INT] : 5 -[DOTDICT] (55/8) > {check05} [INT] : 5 -[DOTDICT] (55/9) > {_x} [INT] : 6 -[DOTDICT] (55/10) > {check06} [INT] : 6 -[DOTDICT] (55/11) > {param+1} [INT] : 7 -[DOTDICT] (55/12) > {check07} [INT] : 7 -[DOTDICT] (55/13) > {param-2} [INT] : 8 -[DOTDICT] (55/14) > {check08} [INT] : 8 -[DOTDICT] (55/15) > {param*3} [INT] : 9 -[DOTDICT] (55/16) > {check09} [INT] : 9 -[DOTDICT] (55/17) > {param/4} [INT] : 10 -[DOTDICT] (55/18) > {p01} [DOTDICT] (1/1) > {A} [INT] : 7 -[DOTDICT] (55/19) > {check11} [INT] : 7 -[DOTDICT] (55/20) > {p02} [DOTDICT] (1/1) > {0} [INT] : 8 -[DOTDICT] (55/21) > {check12} [INT] : 8 -[DOTDICT] (55/22) > {p03} [DOTDICT] (1/1) > {_} [INT] : 9 -[DOTDICT] (55/23) > {check13} [INT] : 9 -[DOTDICT] (55/24) > {p04} [DOTDICT] (1/1) > {Ax} [INT] : 10 -[DOTDICT] (55/25) > {check14} [INT] : 10 -[DOTDICT] (55/26) > {p05} [DOTDICT] (1/1) > {0x} [INT] : 11 -[DOTDICT] (55/27) > {check15} [INT] : 11 -[DOTDICT] (55/28) > {p06} [DOTDICT] (1/1) > {_x} [INT] : 12 -[DOTDICT] (55/29) > {check16} [INT] : 12 -[DOTDICT] (55/30) > {p07} [DOTDICT] (1/1) > {param+1} [INT] : 13 -[DOTDICT] (55/31) > {check17} [INT] : 13 -[DOTDICT] (55/32) > {p08} [DOTDICT] (1/1) > {param-2} [INT] : 14 -[DOTDICT] (55/33) > {check18} [INT] : 14 -[DOTDICT] (55/34) > {p09} [DOTDICT] (1/1) > {param*3} [INT] : 15 -[DOTDICT] (55/35) > {check19} [INT] : 15 -[DOTDICT] (55/36) > {p10} [DOTDICT] (1/1) > {param/4} [INT] : 16 -[DOTDICT] (55/37) > {p11} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/37) > {p11} [LIST] (3/2) > [DOTDICT] (1/1) > {A} [INT] : 17 -[DOTDICT] (55/37) > {p11} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/38) > {check21} [INT] : 17 -[DOTDICT] (55/39) > {p12} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/39) > {p12} [LIST] (3/2) > [DOTDICT] (1/1) > {0} [INT] : 18 -[DOTDICT] (55/39) > {p12} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/40) > {check22} [INT] : 18 -[DOTDICT] (55/41) > {p13} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/41) > {p13} [LIST] (3/2) > [DOTDICT] (1/1) > {_} [INT] : 19 -[DOTDICT] (55/41) > {p13} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/42) > {check23} [INT] : 19 -[DOTDICT] (55/43) > {p14} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/43) > {p14} [LIST] (3/2) > [DOTDICT] (1/1) > {Ax} [INT] : 20 -[DOTDICT] (55/43) > {p14} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/44) > {check24} [INT] : 20 -[DOTDICT] (55/45) > {p15} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/45) > {p15} [LIST] (3/2) > [DOTDICT] (1/1) > {0x} [INT] : 21 -[DOTDICT] (55/45) > {p15} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/46) > {check25} [INT] : 21 -[DOTDICT] (55/47) > {p16} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/47) > {p16} [LIST] (3/2) > [DOTDICT] (1/1) > {_x} [INT] : 22 -[DOTDICT] (55/47) > {p16} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/48) > {check26} [INT] : 22 -[DOTDICT] (55/49) > {p17} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/49) > {p17} [LIST] (3/2) > [DOTDICT] (1/1) > {param+1} [INT] : 23 -[DOTDICT] (55/49) > {p17} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/50) > {check27} [INT] : 23 -[DOTDICT] (55/51) > {p18} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/51) > {p18} [LIST] (3/2) > [DOTDICT] (1/1) > {param-2} [INT] : 24 -[DOTDICT] (55/51) > {p18} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/52) > {check28} [INT] : 24 -[DOTDICT] (55/53) > {p19} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/53) > {p19} [LIST] (3/2) > [DOTDICT] (1/1) > {param*3} [INT] : 25 -[DOTDICT] (55/53) > {p19} [LIST] (3/3) > [INT] : 2 -[DOTDICT] (55/54) > {check29} [INT] : 25 -[DOTDICT] (55/55) > {p20} [LIST] (3/1) > [INT] : 1 -[DOTDICT] (55/55) > {p20} [LIST] (3/2) > [DOTDICT] (1/1) > {param/4} [INT] : 26 -[DOTDICT] (55/55) > {p20} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/1) > {A} [INT] : 1 +[DOTDICT] (86/2) > {check01} [INT] : 1 +[DOTDICT] (86/3) > {0} [INT] : 2 +[DOTDICT] (86/4) > {check02} [INT] : 2 +[DOTDICT] (86/5) > {_} [INT] : 3 +[DOTDICT] (86/6) > {check03} [INT] : 3 +[DOTDICT] (86/7) > {Ax} [INT] : 4 +[DOTDICT] (86/8) > {check04} [INT] : 4 +[DOTDICT] (86/9) > {0x} [INT] : 5 +[DOTDICT] (86/10) > {check05} [INT] : 5 +[DOTDICT] (86/11) > {_x} [INT] : 6 +[DOTDICT] (86/12) > {check06} [INT] : 6 +[DOTDICT] (86/13) > {param+1} [INT] : 7 +[DOTDICT] (86/14) > {check07} [INT] : 7 +[DOTDICT] (86/15) > {param-2} [INT] : 8 +[DOTDICT] (86/16) > {check08} [INT] : 8 +[DOTDICT] (86/17) > {param*3} [INT] : 9 +[DOTDICT] (86/18) > {check09} [INT] : 9 +[DOTDICT] (86/19) > {param/4} [INT] : 10 +[DOTDICT] (86/20) > {check10} [INT] : 10 +[DOTDICT] (86/21) > {p01} [DOTDICT] (1/1) > {A} [INT] : 7 +[DOTDICT] (86/22) > {check11} [INT] : 7 +[DOTDICT] (86/23) > {check12} [INT] : 7 +[DOTDICT] (86/24) > {p02} [DOTDICT] (1/1) > {0} [INT] : 8 +[DOTDICT] (86/25) > {check13} [INT] : 8 +[DOTDICT] (86/26) > {check14} [INT] : 8 +[DOTDICT] (86/27) > {p03} [DOTDICT] (1/1) > {_} [INT] : 9 +[DOTDICT] (86/28) > {check15} [INT] : 9 +[DOTDICT] (86/29) > {check16} [INT] : 9 +[DOTDICT] (86/30) > {p04} [DOTDICT] (1/1) > {Ax} [INT] : 10 +[DOTDICT] (86/31) > {check17} [INT] : 10 +[DOTDICT] (86/32) > {check18} [INT] : 10 +[DOTDICT] (86/33) > {p05} [DOTDICT] (1/1) > {0x} [INT] : 11 +[DOTDICT] (86/34) > {check19} [INT] : 11 +[DOTDICT] (86/35) > {check20} [INT] : 11 +[DOTDICT] (86/36) > {p06} [DOTDICT] (1/1) > {_x} [INT] : 12 +[DOTDICT] (86/37) > {check21} [INT] : 12 +[DOTDICT] (86/38) > {check22} [INT] : 12 +[DOTDICT] (86/39) > {p07} [DOTDICT] (1/1) > {param+1} [INT] : 13 +[DOTDICT] (86/40) > {check23} [INT] : 13 +[DOTDICT] (86/41) > {check24} [INT] : 13 +[DOTDICT] (86/42) > {p08} [DOTDICT] (1/1) > {param-2} [INT] : 14 +[DOTDICT] (86/43) > {check25} [INT] : 14 +[DOTDICT] (86/44) > {check26} [INT] : 14 +[DOTDICT] (86/45) > {p09} [DOTDICT] (1/1) > {param*3} [INT] : 15 +[DOTDICT] (86/46) > {check27} [INT] : 15 +[DOTDICT] (86/47) > {check28} [INT] : 15 +[DOTDICT] (86/48) > {p10} [DOTDICT] (1/1) > {param/4} [INT] : 16 +[DOTDICT] (86/49) > {check29} [INT] : 16 +[DOTDICT] (86/50) > {check30} [INT] : 16 +[DOTDICT] (86/51) > {p11} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/51) > {p11} [LIST] (3/2) > [DOTDICT] (1/1) > {A} [INT] : 17 +[DOTDICT] (86/51) > {p11} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/52) > {check31} [INT] : 17 +[DOTDICT] (86/53) > {check32} [INT] : 17 +[DOTDICT] (86/54) > {p12} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/54) > {p12} [LIST] (3/2) > [DOTDICT] (1/1) > {0} [INT] : 18 +[DOTDICT] (86/54) > {p12} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/55) > {check33} [INT] : 18 +[DOTDICT] (86/56) > {check34} [INT] : 18 +[DOTDICT] (86/57) > {p13} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/57) > {p13} [LIST] (3/2) > [DOTDICT] (1/1) > {_} [INT] : 19 +[DOTDICT] (86/57) > {p13} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/58) > {check35} [INT] : 19 +[DOTDICT] (86/59) > {check36} [INT] : 19 +[DOTDICT] (86/60) > {p14} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/60) > {p14} [LIST] (3/2) > [DOTDICT] (1/1) > {Ax} [INT] : 20 +[DOTDICT] (86/60) > {p14} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/61) > {check37} [INT] : 20 +[DOTDICT] (86/62) > {check38} [INT] : 20 +[DOTDICT] (86/63) > {p15} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/63) > {p15} [LIST] (3/2) > [DOTDICT] (1/1) > {0x} [INT] : 21 +[DOTDICT] (86/63) > {p15} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/64) > {check39} [INT] : 21 +[DOTDICT] (86/65) > {check40} [INT] : 21 +[DOTDICT] (86/66) > {p16} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/66) > {p16} [LIST] (3/2) > [DOTDICT] (1/1) > {_x} [INT] : 22 +[DOTDICT] (86/66) > {p16} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/67) > {check41} [INT] : 22 +[DOTDICT] (86/68) > {check42} [INT] : 22 +[DOTDICT] (86/69) > {p+17} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/69) > {p+17} [LIST] (3/2) > [DOTDICT] (1/1) > {param+1} [INT] : 23 +[DOTDICT] (86/69) > {p+17} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/70) > {check43} [INT] : 23 +[DOTDICT] (86/71) > {check44} [INT] : 23 +[DOTDICT] (86/72) > {p-18} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/72) > {p-18} [LIST] (3/2) > [DOTDICT] (1/1) > {param-2} [INT] : 24 +[DOTDICT] (86/72) > {p-18} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/73) > {check45} [INT] : 24 +[DOTDICT] (86/74) > {check46} [INT] : 24 +[DOTDICT] (86/75) > {p*19} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/75) > {p*19} [LIST] (3/2) > [DOTDICT] (1/1) > {param*3} [INT] : 25 +[DOTDICT] (86/75) > {p*19} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/76) > {check47} [INT] : 25 +[DOTDICT] (86/77) > {check48} [INT] : 25 +[DOTDICT] (86/78) > {p/20} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/78) > {p/20} [LIST] (3/2) > [DOTDICT] (1/1) > {param/4} [INT] : 26 +[DOTDICT] (86/78) > {p/20} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/79) > {check49} [INT] : 26 +[DOTDICT] (86/80) > {check50} [INT] : 26 +[DOTDICT] (86/81) > {p@22} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/81) > {p@22} [LIST] (3/2) > [DOTDICT] (1/1) > {param@6} [INT] : 28 +[DOTDICT] (86/81) > {p@22} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/82) > {check53} [INT] : 28 +[DOTDICT] (86/83) > {check54} [INT] : 28 +[DOTDICT] (86/84) > {p23} [LIST] (3/1) > [INT] : 1 +[DOTDICT] (86/84) > {p23} [LIST] (3/2) > [DOTDICT] (1/1) > {param7} [INT] : 28 +[DOTDICT] (86/84) > {p23} [LIST] (3/3) > [INT] : 2 +[DOTDICT] (86/85) > {check55} [INT] : 28 +[DOTDICT] (86/86) > {check56} [INT] : 28 """ listofdictUsecases.append(dictUsecase) del dictUsecase @@ -1726,7 +1764,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0450" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (1)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1740,7 +1778,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0451" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (2)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1754,7 +1792,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0452" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (3)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1768,7 +1806,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0453" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (4)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1782,7 +1820,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0454" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (5)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1796,7 +1834,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0455" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (6)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1810,7 +1848,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0456" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (7)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1824,7 +1862,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0457" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (8)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1838,7 +1876,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0458" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (9)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1852,7 +1890,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0459" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (10)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1866,7 +1904,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0460" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (11)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1880,7 +1918,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0461" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (12)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1894,7 +1932,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0462" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (13)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1908,7 +1946,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0463" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (14)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1922,7 +1960,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0464" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (15)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1936,7 +1974,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0465" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (16)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None @@ -1950,7 +1988,7 @@ dictUsecase = {} dictUsecase['TESTID'] = "JPP_0466" dictUsecase['DESCRIPTION'] = "JSON file with several invalid parameter names (17)" -dictUsecase['EXPECTATION'] = "All names are accepted (in definition and in reference)" +dictUsecase['EXPECTATION'] = "Expected: No values are returned, and JsonPreprocessor throws an exception" dictUsecase['SECTION'] = "NAMING_CONVENTION" dictUsecase['SUBSECTION'] = "BADCASE" dictUsecase['HINT'] = None diff --git a/test/testfiles/jpp-test_config_0400.jsonp b/test/testfiles/jpp-test_config_0400.jsonp index 4b4d79ef..60ae5403 100644 --- a/test/testfiles/jpp-test_config_0400.jsonp +++ b/test/testfiles/jpp-test_config_0400.jsonp @@ -15,10 +15,8 @@ { "A" : 1, "check01" : ${A}, - // Bug: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/357#issuecomment-2435677836 - // 'The parameter '${0}' is not available!'! - // "0" : 2, - // "check02" : ${0}, + "0" : 2, + "check02" : ${0}, "_" : 3, "check03" : ${_}, // @@ -36,55 +34,84 @@ "param*3" : 9, "check09" : ${param*3}, "param/4" : 10, - // bug: https://github.com/test-fullautomation/python-jsonpreprocessor/issues/356#issuecomment-2435708593 - // Expecting ',' delimiter - // "check10" : ${param/4}, + "check10" : ${param/4}, // - "p01" : {"A" : 7}, + "p01" : {"A" : 7}, "check11" : ${p01}['A'], - "p02" : {"0" : 8}, - "check12" : ${p02}['0'], - "p03" : {"_" : 9}, - "check13" : ${p03}['_'], + "check12" : ${p01.A}, + "p02" : {"0" : 8}, + "check13" : ${p02}['0'], + "check14" : ${p02.0}, + "p03" : {"_" : 9}, + "check15" : ${p03}['_'], + "check16" : ${p03._}, // - "p04" : {"Ax" : 10}, - "check14" : ${p04}['Ax'], - "p05" : {"0x" : 11}, - "check15" : ${p05}['0x'], - "p06" : {"_x" : 12}, - "check16" : ${p06}['_x'], + "p04" : {"Ax" : 10}, + "check17" : ${p04}['Ax'], + "check18" : ${p04.Ax}, + "p05" : {"0x" : 11}, + "check19" : ${p05}['0x'], + "check20" : ${p05.0x}, + "p06" : {"_x" : 12}, + "check21" : ${p06}['_x'], + "check22" : ${p06._x}, + + "p07" : {"param+1" : 13}, + "check23" : ${p07}['param+1'], + "check24" : ${p07.param+1}, + "p08" : {"param-2" : 14}, + "check25" : ${p08}['param-2'], + "check26" : ${p08.param-2}, + "p09" : {"param*3" : 15}, + "check27" : ${p09}['param*3'], + "check28" : ${p09.param*3}, + "p10" : {"param/4" : 16}, + "check29" : ${p10}['param/4'], + "check30" : ${p10.param/4}, // - "p07" : {"param+1" : 13}, - "check17" : ${p07}['param+1'], - "p08" : {"param-2" : 14}, - "check18" : ${p08}['param-2'], - "p09" : {"param*3" : 15}, - "check19" : ${p09}['param*3'], - "p10" : {"param/4" : 16}, - // Expecting ',' delimiter - // "check20" : ${p10}['param/4'], + "p11" : [1, {"A" : 17}, 2], + "check31" : ${p11}[1]['A'], + "check32" : ${p11.1.A}, + "p12" : [1, {"0" : 18}, 2], + "check33" : ${p12}[1]['0'], + "check34" : ${p12.1.0}, + "p13" : [1, {"_" : 19}, 2], + "check35" : ${p13}[1]['_'], + "check36" : ${p13.1._}, // - "p11" : [1, {"A" : 17}, 2], - "check21" : ${p11}[1]['A'], - "p12" : [1, {"0" : 18}, 2], - "check22" : ${p12}[1]['0'], - "p13" : [1, {"_" : 19}, 2], - "check23" : ${p13}[1]['_'], + "p14" : [1, {"Ax" : 20}, 2], + "check37" : ${p14}[1]['Ax'], + "check38" : ${p14.1.Ax}, + "p15" : [1, {"0x" : 21}, 2], + "check39" : ${p15}[1]['0x'], + "check40" : ${p15.1.0x}, + "p16" : [1, {"_x" : 22}, 2], + "check41" : ${p16}[1]['_x'], + "check42" : ${p16.1._x}, // - "p14" : [1, {"Ax" : 20}, 2], - "check24" : ${p14}[1]['Ax'], - "p15" : [1, {"0x" : 21}, 2], - "check25" : ${p15}[1]['0x'], - "p16" : [1, {"_x" : 22}, 2], - "check26" : ${p16}[1]['_x'], - // // - "p17" : [1, {"param+1" : 23}, 2], - "check27" : ${p17}[1]['param+1'], - "p18" : [1, {"param-2" : 24}, 2], - "check28" : ${p18}[1]['param-2'], - "p19" : [1, {"param*3" : 25}, 2], - "check29" : ${p19}[1]['param*3'], - "p20" : [1, {"param/4" : 26}, 2] - // Expecting ',' delimiter - // "check30" : ${p20}[1]['param/4'] + "p+17" : [1, {"param+1" : 23}, 2], + "check43" : ${p+17}[1]['param+1'], + "check44" : ${p+17.1.param+1}, + "p-18" : [1, {"param-2" : 24}, 2], + "check45" : ${p-18}[1]['param-2'], + "check46" : ${p-18.1.param-2}, + "p*19" : [1, {"param*3" : 25}, 2], + "check47" : ${p*19}[1]['param*3'], + "check48" : ${p*19.1.param*3}, + "p/20" : [1, {"param/4" : 26}, 2], + "check49" : ${p/20}[1]['param/4'], + "check50" : ${p/20.1.param/4}, + + // https://github.com/test-fullautomation/python-jsonpreprocessor/issues/406 + // 'invalid group reference 5 at position 9'! + // "p\\21" : [1, {"param\\5" : 27}, 2] + // "check51" : ${p\\21}[1]['param\\5'], + // "check52" : ${p\\21.1.param\\5}, + + "p@22" : [1, {"param@6" : 28}, 2], + "check53" : ${p@22}[1]['param@6'], + "check54" : ${p@22.1.param@6}, + " p23 " : [1, {" param7 " : 28}, 2], + "check55" : ${p23}[1]['param7'], + "check56" : ${p23.1.param7} } diff --git a/test/testfiles/jpp-test_config_0952.jsonp b/test/testfiles/jpp-test_config_0952.jsonp index 940763a2..0ed9ad6c 100644 --- a/test/testfiles/jpp-test_config_0952.jsonp +++ b/test/testfiles/jpp-test_config_0952.jsonp @@ -13,7 +13,7 @@ // limitations under the License. //************************************************************************** { - "I_am" : "syntax error" - "I_am" : "syntax error" - "I_am" : "syntax error" + "line_1" : "missing comma at end of line 1" + "line_2" : "missing comma at end of line 2" + "line_3" : "line 3" } \ No newline at end of file diff --git a/test/testtools/GenSnippetsJPP.py b/test/testtools/GenSnippetsJPP.py index 5121332a..dacaf118 100644 --- a/test/testtools/GenSnippetsJPP.py +++ b/test/testtools/GenSnippetsJPP.py @@ -22,8 +22,8 @@ # # ************************************************************************************************************** # -VERSION = "0.35.0" -VERSION_DATE = "03.01.2025" +VERSION = "0.37.0" +VERSION_DATE = "09.01.2025" # # ************************************************************************************************************** @@ -4040,8 +4040,7 @@ def GetAdditionalBrackets(self): *28*] *29*}, 7 - *30*] -""" + *30*]""" sCodeSnippetPattern = """{ ####DATASTRUCTURE#### @@ -4053,7 +4052,7 @@ def GetAdditionalBrackets(self): # expression and placeholder per iteration. All remaining placeholders in current iteration are replaced by elements # from a list of filler expressions (simple letters) that are only used to complete the code snippet, but are not in focus. - listExpressions = ["{", "}", "[", "]", "$"] + listExpressions = ["{", "}", "[", "]", "(", ")", ":", ",", "$", "&", "@", " "] listPlaceholders = ["*01*", "*02*", "*03*", "*04*", "*05*", "*06*", "*07*", "*08*", "*09*", "*10*", "*11*", "*12*", "*13*", "*14*", "*15*", "*16*", "*17*", "*18*", "*19*", "*20*", @@ -4254,7 +4253,7 @@ def GetNamingConventions(self): # expression and placeholder per iteration. All remaining placeholders in current iteration are replaced by elements # from a list of filler expressions (simple letters) that are only used to complete the code snippet, but are not in focus. - listExpressions = ["+", "-", "*", "/" , "|", "$", "%", "#", "\\", "\\\\", "𠼭", "€", "ß", "{", "}", "[", "]", "'"] + listExpressions = ["+", "-", "*", "/" , "|", "$", "%", "#", "\\", "\\\\", "𠼭", "€", "ß", "{", "}", "[", "]", "'", "@", ":", " "] listPlaceholders = ["*01*", "*02*", "*03*", "*04*", "*05*", "*06*"] From 7317c833509c2d52513a939b8e66ec1c08099700 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Fri, 10 Jan 2025 21:08:03 +0100 Subject: [PATCH 2/3] Code snippet generator: Patterns extended --- test/testtools/GenSnippetsJPP.py | 179 +++++++++++++++++++------------ 1 file changed, 109 insertions(+), 70 deletions(-) diff --git a/test/testtools/GenSnippetsJPP.py b/test/testtools/GenSnippetsJPP.py index dacaf118..4d74a407 100644 --- a/test/testtools/GenSnippetsJPP.py +++ b/test/testtools/GenSnippetsJPP.py @@ -22,8 +22,8 @@ # # ************************************************************************************************************** # -VERSION = "0.37.0" -VERSION_DATE = "09.01.2025" +VERSION = "0.38.0" +VERSION_DATE = "10.01.2025" # # ************************************************************************************************************** @@ -4022,57 +4022,76 @@ def GetAdditionalBrackets(self): sHeadline = "Additional brackets at several positions within a complex data structure" - # data structure - sDataStructure1 = """ "C" : *01*1, - "params" : *02*[ - *03*2, - *04*{"A" : 3, - *05*"B" : *06*[ - *07*{ - *08*"C" : 4, - *09*${params.1.B.0.C*10*} : 10, - *11*"D" : 5, - *12*${params*13*}*14*[1]*15*['B']*16*[0]*17*['D'*18*] : 11, - "E" : *19*["020", *20*{"021" : "022"*21*}*22*], - "F" : *23*{"023" : *24*["024", "025"*25*]*26*} - *27*}, - 6 - *28*] - *29*}, - 7 - *30*]""" + # data structure with placeholders + sDataStructurePattern = """ "A" : 1, "B" : 2, "C" : 3, "D" : 4, "E" : 5, "F" : 6, "G" : 7, "H" : 8, "I" : 9, "J" : 10, + "params" : #01#[#02# + #03#11#04#, + #05#{#06#"A" : 12, + "B" : #07#[#08# + #09#{#10# + "C" : 13, + #11#$#12#{params}#13#[#14#1#15#]#16#[#17#'B'#18#]#19#[#20#0#21#]#22#[#23#'C'#24#]#25# : 130, + "D" : 14, + #26#$#27#{params.1.B.0.D}#28# : 140, + "E" : 15, + "F" : 16, + "G" : #29#["017", #30#{#31#"018" : "019"#32#}#33#]#34#, + "H" : #35#[#36#{#37#"020" : "021"#38#}#39#, "022"#40#]#41#, + "I" : #42#{#43#"023" : #44#[#45#"024", "025"#46#]#47#}#48#, + "J" : #49#{#50#"026" : #51#[#52#"027", #53#{#54#"028" : #55#[#56#"029", "030"#57#]#58#}#59#]#60#}#61# + }, + 31 + ] + }, + 32 + ], + ${params}[1]['B'][0]['E'] : 150, + ${params.1.B.0.F} : 160, + #62#$#63#{params}#64#[#65#1#66#]#67#[#68#'B'#69#]#70#[#71#0#72#]#73#[#74#'J'#75#]#76#[#77#'026'#78#]#79#[#80#1#81#]#82#[#83#'028'#84#]#85#[#86#0#87#]#88# : "0290", + ${params.1.B.0.J.026.1.028.1} : "0300" """ sCodeSnippetPattern = """{ ####DATASTRUCTURE#### } """ - # We have a list of expressions and we have a list of placeholders like used in sDataStructure1. + # We have a list of expressions and we have a list of placeholders like used in sDataStructurePattern. # The followig code runs in a nested loop: Every expression is placed at every placeholder position. Only one single # expression and placeholder per iteration. All remaining placeholders in current iteration are replaced by elements - # from a list of filler expressions (simple letters) that are only used to complete the code snippet, but are not in focus. + # from a list of filler expressions (empty strings here => placeholders are removed) that are only used to complete + # the code snippet, but are not in focus. - listExpressions = ["{", "}", "[", "]", "(", ")", ":", ",", "$", "&", "@", " "] + listExpressions = ["{", "}", "[", "]", "(", ")", "[]", "{}"] - listPlaceholders = ["*01*", "*02*", "*03*", "*04*", "*05*", "*06*", "*07*", "*08*", "*09*", "*10*", - "*11*", "*12*", "*13*", "*14*", "*15*", "*16*", "*17*", "*18*", "*19*", "*20*", - "*21*", "*22*", "*23*", "*24*", "*25*", "*26*", "*27*", "*28*", "*29*", "*30*"] + nNrOfPlaceholders = 88 - listPositions = listPlaceholders[:] # to support a nested iteration of the same list; better readibility of code because of different names + listPlaceholders = [] + listFillers = [] + for number in range(1, nNrOfPlaceholders+1): + value = str(number).rjust(2, "0") + listPlaceholders.append(f"#{value}#") + listFillers.append("") - listFiller = ["","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""] # as much elements as in listPlaceholders + listPositions = listPlaceholders[:] # to support a nested iterations of the same list (better readibility of code because of different names) # put all things together listCodeSnippets = [] - # sDataStructure1 + # first snippets is without additions (all placeholders removed) + sDataStructure = sDataStructurePattern # init a new data structure from pattern sDataStructurePattern + sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern + for sPlaceholder in listPlaceholders: + sDataStructure = sDataStructure.replace(sPlaceholder, "") + sCodeSnippet = sCodeSnippet.replace("####DATASTRUCTURE####", sDataStructure) + listCodeSnippets.append(sCodeSnippet) + # following snippets with additions for sExpression in listExpressions: for sPosition in listPositions: - sDataStructure = sDataStructure1 # init a new data structure from pattern sDataStructure1 - sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern - oFiller = CListElements(listFiller) # init a new filler object (= content for remaining placeholders) + sDataStructure = sDataStructurePattern # init a new data structure from pattern sDataStructurePattern + sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern + oFiller = CListElements(listFillers) # init a new filler object (= content for remaining placeholders) for sPlaceholder in listPlaceholders: sFiller = oFiller.GetElement() if sPosition == sPlaceholder: @@ -4091,69 +4110,89 @@ def GetAdditionalBrackets(self): # -------------------------------------------------------------------------------------------------------------- - def GetSpecialCharacters(self): - """Special characters at several positions within a complex data structure + def GetAdditionalCharacters(self): + """Additional characters at several positions within a complex data structure """ - sHeadline = "Special characters at several positions within a complex data structure" - - # data structure 1 - sDataStructure1 = """ "params" : {*01* : *02*, - *03* : [*04*, {*05* : *06*, - *07* : [*08*, [*09*, *10*]], - *11* : [*12*, {*13* : *14*}], - *15* : {*16* : [*17*, *18*]}, - *19* : {*20* : {*21* : *22*}} - } - ] - }""" - - sDefinitions = """ "indexP" : 0, - "keyP" : "A", - "dictP" : {"A" : 0, "B" : 1}, - "listP" : ["A", "B"], -""" + sHeadline = "Additional characters at several positions within a complex data structure" + + # data structure with placeholders + sDataStructurePattern = """ "A" : 1, "B" : 2, "C" : 3, "D" : 4, "E" : 5, "F" : 6, "G" : 7, "H" : 8, "I" : 9, "J" : 10, + "params" : #01#[#02# + #03#11#04#, + #05#{#06#"A" #07#: #08#12, + "B" : #09#[#10# + #11#{#12# + "C" : 13, + #13#$#14#{params}#15#[#16#1#17#]#18#[#19#'B'#20#]#21#[#22#0#23#]#24#[#25#'C'#26#]#27# : 130, + "D" : 14, + #28#$#29#{params.1.B.0.D}#30# : #31#140, + "E" : 15, + "F" : 16, + "G" : ["017", {"018" : "019"}], + "H" : [{"020" : "021"}, "022"], + "I" : {"023" : ["024", "025"]}, + #32#"J"#33# : #34#{#35#"026" #36#:#37# [#38#"027", #39#{#40#"028" : #41#[#42#"029", #43# "030"#44#]#45#}#46#]#47#}#48# + #49#}#50#,#51# + 31 + #52#]#53# + }, + 32 + ], + ${params}[1]['B'][0]['E'] : 150, + ${params.1.B.0.F} : 160, + #54#${params}#55#[#56#1#57#]#58#[#59#'B'#60#]#61#[#62#0#63#]#64#[#65#'J'#66#]#67#[#68#'026'#69#]#70#[#71#1#72#]#73#[#74#'028'#75#]#76#[#77#0#78#]#79# : "0290",#80# + ${params.1.B.0.J.026.1.028.1} : "0300" """ sCodeSnippetPattern = """{ -####DEFINITIONS#### ####DATASTRUCTURE#### } """ - # We have a list of expressions and we have a list of placeholders like used in sDataStructure1. + # We have a list of expressions and we have a list of placeholders like used in sDataStructurePattern. # The followig code runs in a nested loop: Every expression is placed at every placeholder position. Only one single # expression and placeholder per iteration. All remaining placeholders in current iteration are replaced by elements - # from a list of filler expressions (simple letters) that are only used to complete the code snippet, but are not in focus. + # from a list of filler expressions (empty strings here => placeholders are removed) that are only used to complete + # the code snippet, but are not in focus. - listExpressions = [".", "..", "[]", "[..]", "[. .]", "{}", "{..}", "{. .}", "/", "\\", "|", "*", "+", "-", "$", "\"", "'", "#", "\"#\"", ":"] + listExpressions = ["+", "-", "*", "/", "_", ".", "..", "$", "'", "\"", "|", ":", "$", "&", "@", "%", "#"] - listPlaceholders = ["*01*", "*02*", "*03*", "*04*", "*05*", "*06*", "*07*", "*08*", "*09*", "*10*", "*11*", - "*12*", "*13*", "*14*", "*15*", "*16*", "*17*", "*18*", "*19*", "*20*", "*21*", "*22*"] + nNrOfPlaceholders = 80 - listPositions = listPlaceholders[:] # to support a nested iteration of the same list; better readibility of code because of different names + listPlaceholders = [] + listFillers = [] + for number in range(1, nNrOfPlaceholders+1): + value = str(number).rjust(2, "0") + listPlaceholders.append(f"#{value}#") + listFillers.append("") - listFiller = ["001","002","003","004","005","006","007","008","009","010", - "011","012","013","014","015","016","017","018","019","020","021","022"] # as much elements as in listPlaceholders + listPositions = listPlaceholders[:] # to support a nested iterations of the same list (better readibility of code because of different names) # put all things together listCodeSnippets = [] - # sDataStructure1 + # first snippets is without additions (all placeholders removed) + sDataStructure = sDataStructurePattern # init a new data structure from pattern sDataStructurePattern + sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern + for sPlaceholder in listPlaceholders: + sDataStructure = sDataStructure.replace(sPlaceholder, "") + sCodeSnippet = sCodeSnippet.replace("####DATASTRUCTURE####", sDataStructure) + listCodeSnippets.append(sCodeSnippet) + # following snippets with additions for sExpression in listExpressions: for sPosition in listPositions: - sDataStructure = sDataStructure1 # init a new data structure from pattern sDataStructure1 - sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern - oFiller = CListElements(listFiller) # init a new filler object (= content for remaining placeholders) + sDataStructure = sDataStructurePattern # init a new data structure from pattern sDataStructurePattern + sCodeSnippet = sCodeSnippetPattern # init a new code snippet from code snippet pattern + oFiller = CListElements(listFillers) # init a new filler object (= content for remaining placeholders) for sPlaceholder in listPlaceholders: sFiller = oFiller.GetElement() if sPosition == sPlaceholder: sDataStructure = sDataStructure.replace(sPlaceholder, sExpression) else: - sDataStructure = sDataStructure.replace(sPlaceholder, f"\"{sFiller}\"") + sDataStructure = sDataStructure.replace(sPlaceholder, f"{sFiller}") # eof for sPlaceholder in listPlaceholders: - sCodeSnippet = sCodeSnippet.replace("####DEFINITIONS####", sDefinitions) sCodeSnippet = sCodeSnippet.replace("####DATASTRUCTURE####", sDataStructure) listCodeSnippets.append(sCodeSnippet) # eof for sPosition in listPositions: @@ -4161,7 +4200,7 @@ def GetSpecialCharacters(self): return sHeadline, listCodeSnippets - # eof def GetSpecialCharacters(self): + # eof def GetAdditionalCharacters(self): # -------------------------------------------------------------------------------------------------------------- @@ -4664,7 +4703,7 @@ def GetInternalTokenStrings(self): sHeadline, listCodeSnippets = oSnippets.GetAdditionalBrackets() bSuccess, sResult = oExecutor.Execute(sHeadline, listCodeSnippets, "JPP") -sHeadline, listCodeSnippets = oSnippets.GetSpecialCharacters() +sHeadline, listCodeSnippets = oSnippets.GetAdditionalCharacters() bSuccess, sResult = oExecutor.Execute(sHeadline, listCodeSnippets, "JPP") sHeadline, listCodeSnippets = oSnippets.GetSlicing() From d254cd47d5e49782bfcdcb2931e5349eb1bbbad2 Mon Sep 17 00:00:00 2001 From: qth2hi Date: Tue, 14 Jan 2025 11:11:45 +0100 Subject: [PATCH 3/3] tiny documentation maintenance --- JsonPreprocessor/JsonPreprocessor.pdf | Bin 340853 -> 340920 bytes .../additional_docs/The JSONP format.tex | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/JsonPreprocessor/JsonPreprocessor.pdf b/JsonPreprocessor/JsonPreprocessor.pdf index b4d74cda04f537f36a991030ae458bbeaca30863..e79353550f0e5e781f20eae837e89bb2e6db41a4 100644 GIT binary patch delta 30585 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