From 0d147f43f2c3f2d4a7917d8306453e0b8bb3cbcf Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Tue, 5 Nov 2024 15:19:13 +0000 Subject: [PATCH] adds tests for the utility classes, cleans up docs --- developer/document/GraphDirectedAcyclic.txt | 77 ++++++ developer/document/dependency_graph.html | 246 +++++++++--------- .../document/unique_node_label_check.txt | 15 -- developer/javac/File.java | 9 +- developer/javac/GraphDirectedAcyclic.java | 70 ----- .../ReasoningTechnology/Ariadne/File.class | Bin 0 -> 4552 bytes .../ReasoningTechnology/Ariadne/Graph.class | Bin 0 -> 2889 bytes .../Ariadne/GraphDirectedAcyclic$1.class | Bin 0 -> 816 bytes .../Ariadne/GraphDirectedAcyclic$2.class | Bin 0 -> 848 bytes .../Ariadne/GraphDirectedAcyclic.class | Bin 0 -> 8778 bytes .../ReasoningTechnology/Ariadne/Label.class | Bin 0 -> 1038 bytes .../Ariadne/LabelList.class | Bin 0 -> 829 bytes .../ReasoningTechnology/Ariadne/Node.class | Bin 0 -> 1493 bytes .../Ariadne/NodeList.class | Bin 0 -> 404 bytes .../Ariadne/Production.class | Bin 0 -> 317 bytes .../Ariadne/ProductionList.class | Bin 0 -> 428 bytes .../ReasoningTechnology/Ariadne/Token.class | Bin 0 -> 948 bytes .../Ariadne/TokenSet.class | Bin 0 -> 401 bytes .../ReasoningTechnology/Ariadne/Util.class | Bin 0 -> 1673 bytes developer/shell/Build | 2 + developer/shell/build | 2 - document/todo.txt | 29 ++- release/Ariadne.jar | Bin 13716 -> 15291 bytes release/Build | 2 + release/build | 2 - tester/data_Test_File_0/I_exist | 0 tester/data_Test_File_0/file_0 | 0 tester/data_Test_File_0/file_1 | 0 tester/data_Test_File_0/file_2 | 0 tester/data_Test_File_0/file_3 | 0 .../document/transcript_first_block_test.txt | 44 ---- tester/document/what_the_tests_do.txt | 9 - tester/javac/#Test2.javax# | 216 +++++++++++++++ tester/javac/TestBench.java | 220 ---------------- tester/javac/TestTestBench.java | 62 ----- tester/javac/Test_File_0.java | 109 ++++++++ tester/javac/Test_LabelList_0.java | 37 +++ tester/javac/Test_Label_0.java | 35 +++ tester/javac/Test_NodeList_0.java | 34 +++ tester/javac/Test_Node_0.java | 69 +++++ tester/javac/Test_TokenSet_0.java | 50 ++++ tester/javac/Test_Token_0.java | 48 ++++ tester/javac/Test_Util_0.java | 52 ++++ tester/javac/import_aliases.java | 4 + tester/jvm/TestBench.jar | Bin 5056 -> 0 bytes tester/jvm/Test_Ariadne.jar | Bin 0 -> 15018 bytes tester/scratchpad/MU.class | Bin 0 -> 262 bytes tester/scratchpad/Test_File_0$TestSuite.class | Bin 0 -> 4749 bytes tester/scratchpad/Test_File_0.class | Bin 0 -> 739 bytes .../Test_LabelList_0$TestSuite.class | Bin 0 -> 1855 bytes tester/scratchpad/Test_LabelList_0.class | Bin 0 -> 769 bytes .../scratchpad/Test_Label_0$TestSuite.class | Bin 0 -> 1464 bytes tester/scratchpad/Test_Label_0.class | Bin 0 -> 745 bytes .../Test_NodeList_0$TestSuite.class | Bin 0 -> 1413 bytes tester/scratchpad/Test_NodeList_0.class | Bin 0 -> 763 bytes tester/scratchpad/Test_Node_0$TestSuite.class | Bin 0 -> 2884 bytes tester/scratchpad/Test_Node_0.class | Bin 0 -> 739 bytes .../Test_TokenSet_0$TestSuite.class | Bin 0 -> 1819 bytes tester/scratchpad/Test_TokenSet_0.class | Bin 0 -> 763 bytes .../scratchpad/Test_Token_0$TestSuite.class | Bin 0 -> 1738 bytes tester/scratchpad/Test_Token_0.class | Bin 0 -> 745 bytes tester/scratchpad/Test_Util_0$TestSuite.class | Bin 0 -> 1890 bytes tester/scratchpad/Test_Util_0.class | Bin 0 -> 739 bytes tester/shell/TestTestBench | 2 - tester/shell/Test_File_0 | 2 + tester/shell/Test_LabelList_0 | 2 + tester/shell/Test_Label_0 | 2 + tester/shell/Test_NodeList_0 | 2 + tester/shell/Test_Node_0 | 2 + tester/shell/Test_TokenSet_0 | 2 + tester/shell/Test_Token_0 | 2 + tester/shell/Test_Util_0 | 2 + tester/test0/TestGraph.class | Bin 1673 -> 0 bytes tester/test0/TestGraph.groovy | 14 - tester/test0/env_test | 11 - tester/test0/test.sh | 8 - tester/test0/transcript-tester.txt | 29 --- tester/test0/transcript_dev.txt | 36 --- tester/tool/env | 2 +- tester/tool/shell_wrapper_list | 12 +- tool_shared/bespoke/bashrc | 51 ++++ 81 files changed, 973 insertions(+), 651 deletions(-) create mode 100644 developer/document/GraphDirectedAcyclic.txt delete mode 100644 developer/document/unique_node_label_check.txt create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/GraphDirectedAcyclic$1.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/GraphDirectedAcyclic$2.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/GraphDirectedAcyclic.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Label.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/LabelList.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Node.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/NodeList.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Production.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/ProductionList.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Token.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/TokenSet.class create mode 100644 developer/scratchpad/com/ReasoningTechnology/Ariadne/Util.class create mode 100755 developer/shell/Build delete mode 100755 developer/shell/build create mode 100755 release/Build delete mode 100755 release/build create mode 100644 tester/data_Test_File_0/I_exist create mode 100644 tester/data_Test_File_0/file_0 create mode 100644 tester/data_Test_File_0/file_1 create mode 100644 tester/data_Test_File_0/file_2 create mode 100644 tester/data_Test_File_0/file_3 delete mode 100644 tester/document/transcript_first_block_test.txt delete mode 100644 tester/document/what_the_tests_do.txt create mode 100644 tester/javac/#Test2.javax# delete mode 100644 tester/javac/TestBench.java delete mode 100644 tester/javac/TestTestBench.java create mode 100644 tester/javac/Test_File_0.java create mode 100644 tester/javac/Test_LabelList_0.java create mode 100644 tester/javac/Test_Label_0.java create mode 100644 tester/javac/Test_NodeList_0.java create mode 100644 tester/javac/Test_Node_0.java create mode 100644 tester/javac/Test_TokenSet_0.java create mode 100644 tester/javac/Test_Token_0.java create mode 100644 tester/javac/Test_Util_0.java create mode 100644 tester/javac/import_aliases.java delete mode 100644 tester/jvm/TestBench.jar create mode 100644 tester/jvm/Test_Ariadne.jar create mode 100644 tester/scratchpad/MU.class create mode 100644 tester/scratchpad/Test_File_0$TestSuite.class create mode 100644 tester/scratchpad/Test_File_0.class create mode 100644 tester/scratchpad/Test_LabelList_0$TestSuite.class create mode 100644 tester/scratchpad/Test_LabelList_0.class create mode 100644 tester/scratchpad/Test_Label_0$TestSuite.class create mode 100644 tester/scratchpad/Test_Label_0.class create mode 100644 tester/scratchpad/Test_NodeList_0$TestSuite.class create mode 100644 tester/scratchpad/Test_NodeList_0.class create mode 100644 tester/scratchpad/Test_Node_0$TestSuite.class create mode 100644 tester/scratchpad/Test_Node_0.class create mode 100644 tester/scratchpad/Test_TokenSet_0$TestSuite.class create mode 100644 tester/scratchpad/Test_TokenSet_0.class create mode 100644 tester/scratchpad/Test_Token_0$TestSuite.class create mode 100644 tester/scratchpad/Test_Token_0.class create mode 100644 tester/scratchpad/Test_Util_0$TestSuite.class create mode 100644 tester/scratchpad/Test_Util_0.class delete mode 100755 tester/shell/TestTestBench create mode 100755 tester/shell/Test_File_0 create mode 100755 tester/shell/Test_LabelList_0 create mode 100755 tester/shell/Test_Label_0 create mode 100755 tester/shell/Test_NodeList_0 create mode 100755 tester/shell/Test_Node_0 create mode 100755 tester/shell/Test_TokenSet_0 create mode 100755 tester/shell/Test_Token_0 create mode 100755 tester/shell/Test_Util_0 delete mode 100644 tester/test0/TestGraph.class delete mode 100644 tester/test0/TestGraph.groovy delete mode 100644 tester/test0/env_test delete mode 100755 tester/test0/test.sh delete mode 100644 tester/test0/transcript-tester.txt delete mode 100644 tester/test0/transcript_dev.txt create mode 100644 tool_shared/bespoke/bashrc diff --git a/developer/document/GraphDirectedAcyclic.txt b/developer/document/GraphDirectedAcyclic.txt new file mode 100644 index 0000000..3da0b12 --- /dev/null +++ b/developer/document/GraphDirectedAcyclic.txt @@ -0,0 +1,77 @@ +Comment that was on the cycle detector code. Was useful for defining +the problem and limitations when defining the code. Might turn +into a list of constraints the user needs to adhere for the algorithm +to be guaranteed to function per spec. Has potential +to be turned into a proof of the algorithm. Begins by laying +out the assumptions the code is working under. + + +/* +Our build tool graph is directed from targets to dependencies. + +It must be cycle free. This class extends `Graph` by marking +cycles that are found when descending from root nodes. Then +`lookup` will not return these nodes. + +If: + + 1. The production functions produce the same output given the + same input. (Which is a given for the map definition portion of + the graph). + + 2. There are a finite number of states. + + 3. Any input values that are used in the definition of the graph are not + changed after some point in time when the graph is said to have been 'defined'. + + 4. No computed values are used for changing the graph definition. + + 5. No computed values direct graph traversal. + +Then: + + We can write an algorithm that in turn starts at each node + in the graph and searches for cycles, and will find all + cycles. + + Our GraphDirectedAcyclic constructor would then not need + to know the root nodes of the traversal. + +However: + + Had the graph definition been limited to the map object, and there is no + interaction with the build functions, we would meet the criteria. + + However, our bestowed upon the user the ability to define 'production' + functions, which are used to build the graph dynamically at run time. + + With such production functions is possible that a a graph definition would + emerge after a finite number of calls to the build function, and thus we still + meet the above criteria, and do not need to give a root node list to the + GraphDirectedAcyclic. + + When a graph is to be used with the build tool, it is required that the graph + meet the criteria above ** when starting from the root nodes **. However, it + is not generally required. Hence, we provide the root nodes to this function. + + It is possible that the user defines one or more production functions, + intentionally nor not, that results in building an unbounded graph definition. + Further it is possible for a user to define a production that has an unbounded + nature that results in the cycle marking method of this class from never + finishing. + + As examples, suppose that the a production follows the digits of pi, giving + a different node definition each time it is fed a label to recognize. Or + suppose that a production returns an ever longer node label each time it + is called. Such a production would cause the graph definition to be open, + and potentially for this cycle detection algorithm to never complete. + + A production for a conventional build environment will not do these things, + However, a buggy production for build environment, or an unconventional + build environment not imagined at this time, could. + + A breadth first search combined programmed as a generator would be able + to handle such cases without hanging. Where as this algorithm plunges + down depth first, and returns when it has the answer. + +*/ diff --git a/developer/document/dependency_graph.html b/developer/document/dependency_graph.html index 378c52d..a728d42 100644 --- a/developer/document/dependency_graph.html +++ b/developer/document/dependency_graph.html @@ -1,137 +1,151 @@ - Dependency Build Algorithm + Class and mature functions reference + -

Cycle Detection in Dependency Graph

-

Overview

-

- The is_acyclic_q function is designed to detect cycles in a dependency graph using a depth-first search (DFS) algorithm. It starts from a list of root node labels and traverses the graph to ensure that there are no cycles. If a cycle is detected, the function marks the nodes involved and continues to explore other parts of the graph. -

-

Key Concepts

- -

Functions

-

1. is_acyclic_q

-

- Purpose: To determine if the dependency graph is acyclic (i.e., contains no cycles). -

-

- Parameters: -

-

-

- Returns: -

-

-

- Process: -

-

-

2. is_acyclic_q_descend

-

- Purpose: To perform the actual DFS traversal and cycle detection for a given path. -

-

- Parameters: -

-

-

- Returns: -

-

-

- Process: -

-

-

Usage

-

- The is_acyclic_q function is used to ensure that the dependency graph defined in the build file is free of cycles. This is crucial for preventing infinite loops and ensuring that the build process can proceed smoothly. -

+
- - + A very rough first draft of a reference to the classes. + +

Cycle Detection on a Dependency Graph

+

Overview

-

2. Run Build Scripts

-
    -
  1. Traverse the queue starting from the tail (the most recently added nodes).
  2. -
  3. For each node, attempt to build it by checking the file dates of the target node and its dependencies: -
      -
    1. If the target file is older than any dependency, execute the node’s build function.
    2. -
    3. After building, recheck the file dates. If the file date has been updated, mark the node as successfully built.
    4. -
    5. If the build fails or the file date is not updated, mark the node with an error in its property list.
    6. -
    -
  4. -
  5. Nodes with dependencies marked with errors will not be built, and errors will propagate up the dependency tree.
  6. -
+

A Dependency Graph: Is a directed acyclic graph + where non-leaf nodes are build targets, which are either symbolic, or + correspond to files in the file system. Leave nodes correspond to files + in the file system, and the only edge property is 'dependency'.

-

3. Final Reporting and Status

-
    -
  1. If the root node is successfully built, report the success and any other successfully built nodes.
  2. -
  3. If an error has propagated to the root, report the failure.
  4. -
  5. Keep a list of all successfully built nodes and provide a final summary of the build status.
  6. -
+

Functions

-

4. Node Definitions

-

Each node in the dependency graph is defined by a property dictionary. A node is either a symbol or a path:

-
    -
  1. Symbol Nodes: These represent abstract concepts or commands and always trigger a build unless marked with an error.
  2. -
  3. Path Nodes: These represent file paths. A path node is considered built if its target file is newer than its dependencies.
  4. -
-

Both node types are identified by a label, and their dependencies are stored as a list of node labels. The presence of an error property indicates that the node has failed to build or encountered a problem during processing.

+

1. is_acyclic_q

+

+ Purpose: To determine if the dependency graph is acyclovir. +

+

+ Parameters: +

+

+

+ Returns: +

+

+

+ Process: +

+

+

2. is_acyclic_q_descend

+

+ Purpose: To perform the actual DFS traversal and cycle detection for a given path. +

+

+ Parameters: +

+

+

+ Returns: +

+

+

+ Process: +

+

+

Usage

+

+ The is_acyclic_q function is used to ensure that the dependency graph defined in the build file is free of cycles. This is crucial for preventing infinite loops and ensuring that the build process can proceed smoothly. +

+
diff --git a/developer/document/unique_node_label_check.txt b/developer/document/unique_node_label_check.txt deleted file mode 100644 index b978a74..0000000 --- a/developer/document/unique_node_label_check.txt +++ /dev/null @@ -1,15 +0,0 @@ - -predicate == is_well_formed_q - -We can not check that the node labels are unique because the given value -is a single node, and the code is stateless. Besides there is no contract with -the programmer on how to use the predicated, so the programmer could call the -predicate multiple times on the same node. Now can we test this condition in -our do_markup_graph routine because of the way lookup works, it will always -return the same node for the same label. This would be a truly difficult check -to perform because the map does not given an error but just takes the second of -the duplicate key definitions (is this really true?) besides, it would require -a formal proof of the recognizer functions that they do not return different -definitions for different keys to match regexprs against. I've been mulling -this over. As we currently the programmer provides the map and function -definitions, we don't even know which nodes will be in the graph... diff --git a/developer/javac/File.java b/developer/javac/File.java index b101ea8..109d7b6 100644 --- a/developer/javac/File.java +++ b/developer/javac/File.java @@ -1,8 +1,11 @@ package com.ReasoningTechnology.Ariadne; -import java.io.*; -import java.nio.file.*; -import java.util.*; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import com.ReasoningTechnology.Mosaic.IO; public class File { static boolean debug = false; diff --git a/developer/javac/GraphDirectedAcyclic.java b/developer/javac/GraphDirectedAcyclic.java index 51950d8..c71a2b9 100644 --- a/developer/javac/GraphDirectedAcyclic.java +++ b/developer/javac/GraphDirectedAcyclic.java @@ -1,75 +1,5 @@ package com.ReasoningTechnology.Ariadne; -/* -Our build tool graph is directed from targets to dependencies. - -It must be cycle free. This class extends `Graph` by marking -cycles that are found when descending from root nodes. Then -`lookup` will not return these nodes. - -If: - - 1. The production functions produce the same output given the - same input. (Which is a given for the map definition portion of - the graph). - - 2. There are a finite number of states. - - 3. Any input values that are used in the definition of the graph are not - changed after some point in time when the graph is said to have been 'defined'. - - 4. No computed values are used for changing the graph definition. - - 5. No computed values direct graph traversal. - -Then: - - We can write an algorithm that in turn starts at each node - in the graph and searches for cycles, and will find all - cycles. - - Our GraphDirectedAcyclic constructor would then not need - to know the root nodes of the traversal. - -However: - - Had the graph definition been limited to the map object, and there is no - interaction with the build functions, we would meet the criteria. - - However, our bestowed upon the user the ability to define 'production' - functions, which are used to build the graph dynamically at run time. - - With such production functions is possible that a a graph definition would - emerge after a finite number of calls to the build function, and thus we still - meet the above criteria, and do not need to give a root node list to the - GraphDirectedAcyclic. - - When a graph is to be used with the build tool, it is required that the graph - meet the criteria above ** when starting from the root nodes **. However, it - is not generally required. Hence, we provide the root nodes to this function. - - It is possible that the user defines one or more production functions, - intentionally nor not, that results in building an unbounded graph definition. - Further it is possible for a user to define a production that has an unbounded - nature that results in the cycle marking method of this class from never - finishing. - - As examples, suppose that the a production follows the digits of pi, giving - a different node definition each time it is fed a label to recognize. Or - suppose that a production returns an ever longer node label each time it - is called. Such a production would cause the graph definition to be open, - and potentially for this cycle detection algorithm to never complete. - - A production for a conventional build environment will not do these things, - However, a buggy production for build environment, or an unconventional - build environment not imagined at this time, could. - - A breadth first search combined programmed as a generator would be able - to handle such cases without hanging. Where as this algorithm plunges - down depth first, and returns when it has the answer. - -*/ - import java.util.HashMap; import java.util.Map; import java.util.List; diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/File.class new file mode 100644 index 0000000000000000000000000000000000000000..ff433cb8ae06dca762491708aed6793ba9d6eb51 GIT binary patch literal 4552 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 literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Graph.class new file mode 100644 index 0000000000000000000000000000000000000000..36d600164c1c57b111e5654ac874773fdb240966 GIT binary patch literal 2889 zcmb_eTUQfT7~LlcOc(}1P;BdMv?#d%(b_AaSfnCqL@HFPw$e#*2qTl3tjUB``Y-xc ze}S*oR&DKCU47EE{5yT^s@-QMg+yt?LtoCE^PTUyzssB#e?9#Tzz3-57{>cO+-~v*Lj%I@Uf0=b+aGS8qVtIi4LFWn87(EFq_1uy-4A_hPgp1yEF)af=+=eN@_vF zRSk;*U1eEpR0PB=fu!q|PV=8r$p3l2>u7Joy5iXN zK;TqI@kQS&H%fu+xdlp4P4|@T+QGEIxm3Hyon3iFSNgg@VwUbHXlz$5G^$1EFIz>2 zl)-{mvYhJ{gXOtNOayCoU0}4M*B5-Nwnk@%+qG=g{?XL86j-HoW+Bw9;WL5nUWw=b z&Ok?}cYvqc@x1j0YiBXlQ9P=LTj`FBVMPe&VP!h1igp8Oq+USVkbcptGerrdK;YzV z4PM=C47&~?IaP9+)fi8ya?+Q)hF_9%wkjb#tbz&EbOw&%jD~9lmaxoTYxYpcFlo*N zro%=HOwX03w`z`t$gpQe%@j){ZF;^r`dat!Qnf_dtTrfGlxEHMHte!2PiXkuz;)a( z@C9zN@wVH3-m0%rqk%W^mcT@(7H_Wz1BY=$!z}~1@uh*UR3zD`Kqe>6ioGFSb33P| zT{qo^<0$84wH9nn7`THKfssyD7s9j-ob$Y(9}(i@^JFc8AwSZ*bEwRl&SIEMPR5h6NmEK8g9Kvo6f()R`SMF70LBvtEDKud^+;FC1n0`R>42S@K*X(y@p#3(>G}ffdf@*UCw%L$qH`R z!5Vkv>7pTzhzGq3e5#(WO$WT5{`nBA(RHOi>sa-=WUSw}g4xs&RpY$nmK|9i zi3Ia405{!ep|lAu^B=GS`|TF~9kSL`F>5)_k{!sr29M?PT6{bCCUE4x`EZPHhhaV^ z;?PwmaTinbfp3e0;rHbXDz?lQEnm)u5x%-68Hqxt~MVODcnp!z|xGErC&}xF;0^`-Qk73-y-b44$`w)GDdx(X2kogJ8>@Vn#;dcxy z@b38dGYs;6{3-SV&rd`A9g&BKcK!i6e<~}1&p?rk@Yi{14uLGaqe>T;1t)> zMCS}H@r9@m%0#|wAymK^xfLD-Ob~(?B~MW56!j})40QGOia#-;VW2mR>vS`&JUL?I z&@$P?V+<*mVxddjp}MKi+;GIQWln3FOX3|m6#;ZO4ZxHzi zK86=6fy4*!QHZhWOQcA#m?PDeks>}3NtEG>pku=* zB~;#Mt&+o7q^V-~v?a~3@j;2y=tvJbN`~6RW-w_SaCM+n<5eO?;qxd_(yHJSdITT%VP;dn&#NCip_j*reS4owA_`T+|5Ou}bZ0liCU@xJ=lZ$D?D; zlqM{z;mA(9BVogCYK1(@>bEL*fQN)~Mo)G7W~>9kB3spGae}VSm2zSw`h=CC_}UHB zh&v=o$WU?a<9Xv}{aqflD9%qtX;|r;s;= z7B0|tZdlQ2_knouTtGF2mdLOM29 znLy#W)|751GRuhJgJx)Y_17dbqm}NqDU7vAOm|q{;@gp?`qNbQ<3}o`&{DJ&4#Px+ z)s2RL-!g+Vq$g^Wa%tMJ^#l1;vcShWOiae%Uy_YY&iNDd0BlaD^j{6wo2_Tw!UTBl^rOiUQ63`p=g;G72Kf zLee&{l=hUCRvAvQ*pr96)3Iq zeXb``ck3;ia-SQc@yN@Fg-`6h>KyPhHdgmh;TfCf@dE_^`~vLH^6DF$F|)IF1hMuD zxwpmq5u6`5_2wAOO(1syc@yaL3Hr`qb68-z443om!x8UL6z@?HAFwVyVp9ZoAwJ>U jSjtGy4i<5qy@LyEb132B7?s&x8Z%`S+50TkXV2e1hCSca literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/GraphDirectedAcyclic.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/GraphDirectedAcyclic.class new file mode 100644 index 0000000000000000000000000000000000000000..e987c4bf5583377f8f2278ee04817fca96d861fe GIT binary patch literal 8778 zcmdT}dwdkvb^eaDyE9r1LI@UEEW^?O7Lp}l7lXax5e(*GFs3|A!AZnucO#n;b20br#ph+-=~9>vZ0P4)AMC}Ma>{XA^o zx772KQ5?c=tDlnwJ{3h2k3`XoPdDNi9#vCLsTN27j_Uqh6ThcsosQx&c+9{V^}-2T z@%sk;z{F@2b8$9`d+@mW@~DY(YWivQbKby(C=z%?y?oZh=hVxi>g9<>d&cq+9p1OE`kCjaG|2L92& zw*=OfeBLRn&)UVJQxt^LPT%l=K=un}3>564!QQk}OgZ^mgWeS)m&);0D`81>w3Lvx*+lkwWV$T}l z*{~}!khi_z0@ZtB0(bteSF5S~1W(i)UqRicVs3%~wQ+dkD=O-LcEWo9j{sBZPam?q z!QTE1BatSiV0GIRFkf25O&t#y3zS3(E@TDhC#bnQhuhdPu9*4bl>Q@S;x+EVx+Xkntxo~#S^+#RY};A_nZNzpf}01 zU7npf$Y`pAn1O#1?0hpw{iJo~j!zH1$thcfjJ$|$W#4F5)8U>|IAqhgrmufy8AG7o%nN1?lMtkwldcZ1t0!nY z$&I90x2DIyKO6WLLH12xG_@5qpwq^AOR%Oo8feuRm1+W9mE5Q09qyYxw-BVRX_-rxA#X&-=UyF{EfJ}+q#mzY5|Xfm!x*6-eU1ASSS)qR8tQOtNkj~$ zapul`S|g@l|7AJhclyVeWRkW76>p;8&~7Jvbz+Di$tmd4(#~c_5ZNm65RVHrE02b zO z%HtweP@Z!CRpOqCK7vKHbWo{*XY0zmEhM7txdp+E)oK5Yoc;B2zR2UVfZ2gZ*ZKi< zLlJA+64d%S?B3dU2am5TtqooA-P*54R8`KwcQxP8HHjKAyNzkD61pq(xz*>F>bI%t zMX$?Rb@uobOSL#Z+i6Cv%Pz-hCX3HNj!_)$^AVlZwxy)Lz7$ctRK6zAdw7Gw{5Vvg z(4gE{Ty5qqk6#9QCRDCH3d3>w1>-cfDxUDhr*>M`v0cjw^ODD=bB#>#CKce7m1U35 zZmT|om6)Jh!*kJg7Kn`HdHtAG8advDE#;E4s($L^*jh9!59eYtt9hs4RmPf(c%Gff z^R|a)u$+5{-fgZhVAn{|b8_^kJFF5) ztatM%+uO^$z!tM{-Xjb>wf(MP?Wx`=0euXat0LqTByI)6O#TqB2D|+s{*oK*6l1}N zAy*RiZ9!>ze>HD|Nq+R*Z0FOwL|o*L49Ki060BRbXU9$4%{!{g48Of{i~>*7I7LNr$bd$_jiosQ9kmd2q)r)L}Q@ zK8z3yK3m#5u09KC?~H|F;Zf8jBcEY!J@)XoiBGT`?L7=vwY)x?8APr z2xIGZyp7UT>+N`lp4)<69NwaPaXQ%+KGWc&m)u* zW`9#j&r#GTLlbq}PkFav8rN4kF861Yb!;l@*i_cBDbR6RpiihuA2q(B&mc8n@$Ks) zF+LS;2RcR(3O$UloYt-M>W*c*?uR<%!ajga<2J3R?-4n9Zpp1?eOp5A^6*We52!PC5s ze}*1@mi9bX<)H&*>kr@{y}=AjK4j^QI!f4x9P&hVA=bjx9=ZnI7{bpHxeaJV0mUj0 z`8^(chN;O+grct_AqFDyR=J2KgMSh6U3Vviv(65ndXB;xIpI`05o$_?;-O~|u0ItI z)t|%kIy{NyQOsBoj)y|k?~yByqot*#BNmQDLI*}M^Ks0&fEWRroit+M6=uwgMIJ`7 zBWC(|CmY)14QDYY8I4Du!K`@n0_N^(iJ!&1QCx8njd3I1FpAc_M@>07_B5qOTds^7 zlzMe696F#DIfwc6IEMwy7pKawZ>OQa^K|ytNYfX%8NQDB_y)T0O~U>ytl@JVzRhj- zBHi>Ig7^{!c?`_qW!!~V_;-^RaW7tF@%ICKng=mO%pu}&084O$;5Tsee7qAsPseVj zw0H4~sn9Ar?iA%H$Em)%=@7NGPU&q_Ppv+Qce5`<86U)ZI5$kq?!qsy6`@XjcrWJ~ zn$)v{nRnwTTmDRsGnF$J!O$K&b_v&tT!LjF#z!}uYv7(A!gvkgXyD!VaW>B({AB>C zyNeP?Oj&pV2|8zCGSqPnKP5PhSUjX%@D}ZYMSJ5RGTwJ!m}3_6d`RY>!xA-kp=w9lmfpI9(A8EKD46eEnd@oZV0 zj>^QiF^a2`W}FP_tVr&v4Cqh_$IY|o4)&&565T)@HJw^Nh9yVq##&Ec0XfysvaExY z3M{{-BI)GVTEgt_S{YUoCaAhR4~p zJmsxp-n@~iW@DLxTQMEKr0H=VpC2F@BY2S1xtC-#aGtSGeKmRc(2ZZ#RHd6sv}8+> zk+ft>MR(GYEfwACY1v%TaR=?~p_pGS&tkFG{jMT@!TtoWk?G!BO$4nWZ{6X&Q9J(ZrHB!K4 zDU!z?-Y>)WlpMnIGJ;p+2yZanDNXV&nJafotGrv5$a|zq-YeJ3QD&2S6Vyc2UES>+t!MGp?VZnHac5O#T*tWAdK}ZqfsXUI5ulIdbZ14s zc?1h`KMXmJD}+%_9zchDl)>ubTIY6Od|Bsioz+yf>eh}>nWjzWw|Wh11L`iKgGq&d zPobX213lLg4ux1_fY>P3D;?@|>EmPca1}<4<@Fka^-P?=1A(v`v?#(KI)k+ruz`8$ zrZd=h0h`#`dE-v<97 UadLMa-SjoSo0Rwh|Nq^O0P%%;vH$=8 literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Label.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Label.class new file mode 100644 index 0000000000000000000000000000000000000000..0bd129e76703de9a8b639225ecdeab1dfccd1dd6 GIT binary patch literal 1038 zcma)4K~EDw6#k~$?Y3oGut-G_DIn7ABAa;eP-9|OgtD*9{f?pZ?-G6;DK!R&3p6az4v|J%U%+_E|7WR1zz-2V4-?7Z5;@tcfvy!&o;ck zeL3v4-2T37`Ek3jE&T)8_f(v0rlYPm5ZG+A!=Cfnm4h(goPD?54MIQcoI1~V{4j8x zhHSY$=NsPOdG9zn70{~I8`_Q=3EZq&SJ4P$qi_tIxZQU{>2uT+?pLiNw;k10BN0wB zPEwS^SEB_A%}BQ2?#bf>dbTSE-7#50c_EN*hQof_-SrgPd<=M7DQIE_H4{1H4cI11 zm^ZP7hXNbdB5mRp7ELVUp1|D2jg0ZdGEnu2#6QMaDzoFu0Xff4$rEqZvC4Ol<+~tl zg^gZ@{tQgo0;64|_yPIaH;9`36{*jRQYg|Eq0ttQrkBGkKcGB5jXB(4#JadEg;k7` zo{zW+=CZXfNS#3&(I0nIv%!<9lS05VNhjVe7PzA@Ib2mvSM{IhOcs|XiuLp2^7V?B z{##7tlgaNnN^!Po_DAUHk^KwB+8NR|{}0f$k^K|;o`SU%Q_Co7S}azHG65ABlzb6u zyvg-=SY_PsTrdl_afjoUDZmm%OyMr;bZACVvE~Cvuv}8nxU6Dzg3E=9D{PiR`84h=0Eu}!2ok(qY-gVD=R^+cc@C-x%xrsTw?IvpRYq*`b*xZlL>Kg@6e4d#0n}Qwy`77T6*-H{L|bYYa;x~>Wbu5$kC{8jKJ3O85~(-RFZ3(c3MBM z$2a8hO#vkcR}Q65?E`ngedXX5;<|9JQU(kIsyq@<0^vM}+6!t95Hi96uDH9{x&yTD zP(5hhp!D6LJUG-wkvF7Vqh90JD3Hzhu?Hjp^w)^4^UOS*vovT~cX)_DbeDXTeIkKP Qt`c5y&HrAZSy*2G1?v39h5!Hn literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Node.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Node.class new file mode 100644 index 0000000000000000000000000000000000000000..a00c7a555e114754e2f7323516b1c4cdb0969531 GIT binary patch literal 1493 zcmb7ET~8B16g|_HcDr4uR6qd{RD`yC)GrihV>Bkjhk}VE7=0nrvS}CE-DbNr;ivcu zeDOggfkYC+lP3NqV?486D-n|7%k11c_nvd_xikCY*O#vV9-*KkiA)>=$i^_IBaDnr zV_ta{)NV0`oDNO7HQZ6lT@7Oz?!|CFh6e(vhIIF~o37I|U2lKemJO56;;wuvb9HG~ zb0yEU>}pI_OH;NSn{=CIrDi*Ir@Ehe%J3cA%xw^rRYX+10@-xWgiUA9 zwDYQ>K2L20W-pi{&|mUoWp7^`h1C1Qybn zo*3P5f@pipaP$1K5dfgHYEa9PnOBghGf0qT)y;A)-QXvB?ST&HxD!cq6 zmB4hbd{wZ(pns!J_s{#m^laF{BXImBQShkIPZ#9acoao zb_+N7aFcxBA?Qjd?sO$HzkLu&b*{s-))3(i7|I?&WIrQxjPUCtL=MsS>J$ATjBp*` zUjZ-}JHXr|uK1RphpQN+B`}8Z0Mlh$h`tQ*qKAlmM@sFEp%FQ*kb{F0Xmf|qeWI{W zlwvAas7{(u7MP}2k&Sc!12RJ68YW10oo8W)QEn$O74SO@R`pK&rCFc(zfZ26YBi2APSD#v^bBVG GZ~8acGFLhP literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/NodeList.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/NodeList.class new file mode 100644 index 0000000000000000000000000000000000000000..48974614b68e7b2dc0c0918430d19cd97d6895f4 GIT binary patch literal 404 zcma)2u};G<6g;PCLqkfTd;weOKn4bemP!bT$?8C>?rv(O52d!`I7t00CL{(vfR92v zN3b!}mhN0)PWWy?eU!11lo`GQ*|)qX0_Us7q5 zZycB2%NO;k^2SreQKt?eGdrqnI_Iu*X&YDQCkhJ(e~;XR(hM=W0^?(s30(fO1y_jp vx55#8xstKR>bBKDck&ML#zusMF=Yl$IM`9U5S;jEZ9VASKk#6V9x8&Do{Ea~2hudwl$bzm1TTJ=2S31%5^EI%5qj9& zVc2D6_Wrou08G($(R1Os@Cm$FW}20@5CoSfXD3D#(-~bQx!`5+W^5@H-C4~`X*3N# zU>0$6pc}!CMoXP-1>b9QxC{Q__5p%FZIXemg+QxLJG_ieJIPtsl3Y=nN6C&5EMz>gB& z1}_CK-Gv$EF*|SA@1L(dfCr3XbTEi8jBp{)o029s6X;yutOUZjDU`q22R-6X9N$#XYs$ zH?S?BpUY?z2&}YDDUIfz`(4Yv)j)yq6qvc&Qb}!OPKE zHyCteH_G4=Uq**=5URR3ET{c&D6rG=lQZviAcsjzo=)KR<0MLY@4V-1KaK;hlbi-I z`L$k<3RD};Wp)8GO>&{s8N40Ih|n`SUv*CcKizeX1Vl3Hu(+cAR8a{mv{UJy9>_O^ zRI@LK{oI_^a9#*l?PN6YgZ)ssvoe8?RAM$PJg{M6&c+TJ0^3(IXTY&h#j1^UYzQp> z3qO}e?+q2O$prQyIi$DiGcja`jA&{yPXl$nw!zn@Vyn;F?w4tQbMVFWixSEGkDhEU>+3RN=}RSJB-Ld#?RE5oLuo1mho Rrh}+Yc`+}7*vz_We*sasrT+i` literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/TokenSet.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/TokenSet.class new file mode 100644 index 0000000000000000000000000000000000000000..ec7275e540c8f7f0468b0da43144327c9f54e2f0 GIT binary patch literal 401 zcma)2!AiqG6r7i)jg6_b{R3~c2lwE?LqkCd;vsl2q4#aNB&+EzBpboc@+5fh1NDro0TCKS%Ol@1|>P~k9Cx35Tb)6A>3<-;4hY@D~rr-h| ve^qygFBdY7SY7uT7%tyIZ)|u77(-^@go9&7AmSK@ScS|UPJ4_n>G|vj%7SA8 literal 0 HcmV?d00001 diff --git a/developer/scratchpad/com/ReasoningTechnology/Ariadne/Util.class b/developer/scratchpad/com/ReasoningTechnology/Ariadne/Util.class new file mode 100644 index 0000000000000000000000000000000000000000..4e01d3ddd8afac053f9190009d82668ac93c0194 GIT binary patch literal 1673 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 diff --git a/release/Build b/release/Build new file mode 100755 index 0000000..2a18026 --- /dev/null +++ b/release/Build @@ -0,0 +1,2 @@ +#!/bin/bash +java com.ReasoningTechnology."Ariadne".Build diff --git a/release/build b/release/build deleted file mode 100755 index f4d3bbc..0000000 --- a/release/build +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -java com/ReasoningTechnology/Ariadne/build diff --git a/tester/data_Test_File_0/I_exist b/tester/data_Test_File_0/I_exist new file mode 100644 index 0000000..e69de29 diff --git a/tester/data_Test_File_0/file_0 b/tester/data_Test_File_0/file_0 new file mode 100644 index 0000000..e69de29 diff --git a/tester/data_Test_File_0/file_1 b/tester/data_Test_File_0/file_1 new file mode 100644 index 0000000..e69de29 diff --git a/tester/data_Test_File_0/file_2 b/tester/data_Test_File_0/file_2 new file mode 100644 index 0000000..e69de29 diff --git a/tester/data_Test_File_0/file_3 b/tester/data_Test_File_0/file_3 new file mode 100644 index 0000000..e69de29 diff --git a/tester/document/transcript_first_block_test.txt b/tester/document/transcript_first_block_test.txt deleted file mode 100644 index 06d4db2..0000000 --- a/tester/document/transcript_first_block_test.txt +++ /dev/null @@ -1,44 +0,0 @@ -2024-10-16T07:05:25Z[] -Thomas-developer@Blossac§/var/user_data/Thomas-developer§ -> cd Ariadne - -2024-10-16T07:05:29Z[] -Thomas-developer@Blossac§/var/user_data/Thomas-developer/Ariadne§ -> source env_tester -REPO_HOME /var/user_data/Thomas-developer/Ariadne/ -ENV tool_shared/bespoke/env -PROJECT Ariadne -ENV tester/tool/env - -2024-10-16T07:05:43Z[Ariadne_tester] -Thomas-developer@Blossac§/var/user_data/Thomas-developer/Ariadne/tester§ -> clean_build_directories -+ cd /var/user_data/Thomas-developer/Ariadne//tester -+ rm -r scratch_pad/com -+ rm jvm/TestBenchAriadne.jar -+ rm shell/TestBenchAriadne -+ set +x -clean_build_directories done. - -2024-10-16T07:05:53Z[Ariadne_tester] -Thomas-developer@Blossac§/var/user_data/Thomas-developer/Ariadne/tester§ -> make -Compiling files... -+ cd /var/user_data/Thomas-developer/Ariadne//tester -+ javac -d scratch_pad javac/TestBenchAriadne.java javac/TestBench.java -+ jar cf jvm/TestBenchAriadne.jar -C scratch_pad . -+ set +x -Creating shell wrappers... -tester/tool/environment done. - -2024-10-16T07:05:57Z[Ariadne_tester] -Thomas-developer@Blossac§/var/user_data/Thomas-developer/Ariadne/tester§ -> ./shell/TestBenchAriadne -Running Ariadne tests... -Total test_map run: 1 -Total test_map passed: 1 -Total test_map failed: 0 - -2024-10-16T07:06:00Z[Ariadne_tester] -Thomas-developer@Blossac§/var/user_data/Thomas-developer/Ariadne/tester§ -> diff --git a/tester/document/what_the_tests_do.txt b/tester/document/what_the_tests_do.txt deleted file mode 100644 index cba1483..0000000 --- a/tester/document/what_the_tests_do.txt +++ /dev/null @@ -1,9 +0,0 @@ - -test0 - see if the tool will compile when given an empty graph. - -test1 - see what happens with a single symbolic node - -javac/TestBenchAriadne - the remainder of the tests. - - - diff --git a/tester/javac/#Test2.javax# b/tester/javac/#Test2.javax# new file mode 100644 index 0000000..c38d8d5 --- /dev/null +++ b/tester/javac/#Test2.javax# @@ -0,0 +1,216 @@ +package com.ReasoningTechnology.Ariadne.TestBench; + +/* +Component smoke test. At least call each method of each class. + +*/ + + +import com.ReasoningTechnology.Ariadne.*; +import com.ReasoningTechnology.TestBench.*; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashMap; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + + +public class Test2 extends TestBench{ + + public static boolean test_Label_0(){ + boolean[] conditions = new boolean[2]; + int i = 0; + + // Test input + Label test_label = new Label("test"); + + // Expected output + String expected_value = "test"; + + // Actual output + conditions[i++] = test_label.get().equals(expected_value); + conditions[i++] = test_label.toString().equals(expected_value); + + return all(conditions); + } + + public static boolean test_Token_0(){ + boolean[] conditions = new boolean[4]; + int i = 0; + + // Test input + Token token = new Token("test_value"); + + // Check if the value is correctly stored and retrieved + conditions[i++] = token.get().equals("test_value"); + + // Check if the string representation is correct + conditions[i++] = token.toString().equals("test_value"); + + // Check equality with another Token object with the same value + Token another_token = new Token("test_value"); + conditions[i++] = token.equals( another_token ); + + // Check the hashCode consistency + conditions[i++] = token.hashCode() == another_token.hashCode(); + + return all(conditions); + } + + public static boolean test_LabelList_0(){ + LabelList label_list = new LabelList(); // Use the constructor + + // Add a label and check the size + label_list.add(new Label("test")); + return label_list.size() == 1; + } + + public static boolean test_Node_0(){ + Node node = new Node(); // Use the constructor + node.put("key", new Object()); + return node.containsKey("key"); + } + + public static boolean test_NodeList_0(){ + NodeList node_list = new NodeList(); // Use the constructor + + // Add a node and check the size + node_list.add(new Node()); // Use Node constructor + return node_list.size() == 1; + } + + public static boolean test_Production_0(){ + Production production = label -> new Node(); // Use the Node constructor + + // Apply the production function + Node node = production.apply(new Label("test")); + return node != null; + } + + public static boolean test_ProductionList_0(){ + ProductionList production_list = new ProductionList(); // Use the constructor + + // Add a production and check the size + production_list.add(label -> new Node()); // Use the Node constructor + return production_list.size() == 1; + } + + public static boolean test_TokenSet_0(){ + TokenSet token_set = new TokenSet(); // Use the constructor + + // Add a token and check if it's contained in the set + token_set.add(new Token("test")); + return token_set.contains(new Token("test")); + } + + public static boolean test_Graph_0() { + boolean[] conditions = new boolean[3]; + int i = 0; + + // Create an empty node map and a production list + Map node_map = new HashMap<>(); + ProductionList production_list = new ProductionList(); + + // Initialize the Graph + Graph graph = new Graph(node_map, production_list); + + // Test that lookup returns null for a non-existent node + Label non_existent_label = new Label("non_existent"); + conditions[i++] = graph.lookup(non_existent_label, false) == null; + + // Add a node to the map and test lookup + Node test_node = new Node(); + Label test_label = new Label("test"); + node_map.put(test_label, test_node); + conditions[i++] = graph.lookup(test_label, false) == test_node; + + // Test lookup with verbosity + conditions[i++] = graph.lookup(test_label).equals(test_node); + + // Return true if all conditions are met + return all(conditions); + } + + public static boolean test_Util_print_list_0(){ + boolean[] conditions = new boolean[1]; + int i = 0; + + String prefix = "Test List:"; + List items = new ArrayList<>(); + items.add("item1"); + items.add("item2"); + items.add("item3"); + + String expectedOutput = "Test List: 'item1', 'item2', 'item3'.\n"; + + ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outContent)); + + // Use a StringBuilder to gather debug messages + StringBuilder debugMessages = new StringBuilder(); + + /* + try { + Util.print_list(prefix, items); + String result = outContent.toString(); + + // Gather debug messages + debugMessages.append("Captured output: ").append(result).append("\n"); + debugMessages.append("Expected output: ").append(expectedOutput).append("\n"); + + conditions[i++] = result.equals(expectedOutput); + } catch (Exception e) { + conditions[i++] = false; + } finally { + System.setOut(originalOut); // Restore System.out + + // Now print the gathered debug messages + System.out.print(debugMessages.toString()); + } + */ + + try { + Util.print_list(prefix, items); + String result = outContent.toString(); + conditions[i++] = result.equals(expectedOutput); + } catch (Exception e) { + conditions[i++] = false; + } finally { + System.setOut(originalOut); + } + + return all(conditions); + } + + + // Method to run all tests + public static void test_Ariadne(){ + Map test_map = new HashMap<>(); + + // Adding tests to the map + test_map.put( "test_File_unpack_file_path_0", test_File_unpack_file_path_0() ); + test_map.put( "test_Label_0", test_Label_0() ); + test_map.put( "test_Token_0", test_Label_0() ); + test_map.put( "test_LabelList_0", test_LabelList_0() ); + test_map.put( "test_Node_0", test_Node_0() ); + test_map.put( "test_NodeList_0", test_NodeList_0() ); + test_map.put( "test_Production_0", test_Production_0() ); + test_map.put( "test_ProductionList_0", test_ProductionList_0() ); + test_map.put( "test_TokenSet_0", test_TokenSet_0() ); + test_map.put("test_Graph_0", test_Graph_0()); + test_map.put("test_Util_print_list_0", test_Util_print_list_0()); + + // Run the tests using TestBench + TestBench.run( test_map ); + } + + // Main function to provide a shell interface for running tests + public static void main(String[] args){ + System.out.println("Running Ariadne tests..."); + test_Ariadne(); // Calls the method to run all tests + } + +} + diff --git a/tester/javac/TestBench.java b/tester/javac/TestBench.java deleted file mode 100644 index 642d09f..0000000 --- a/tester/javac/TestBench.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.ReasoningTechnology.TestBench; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintStream; -import java.lang.reflect.Method; -import java.util.Map; - -public class TestBench{ - - /* -------------------------------------------------------------------------------- - Static Data - */ - - private static PrintStream original_out; - private static PrintStream original_err; - private static InputStream original_in; - - private static ByteArrayOutputStream out_content; - private static ByteArrayOutputStream err_content; - private static InputStream in_content; - - /* -------------------------------------------------------------------------------- - Test utility methods - */ - - // typically used to gather results before a return - public static boolean all(boolean[] conditions){ - for( boolean condition : conditions ){ - if( !condition ){ - return false; - } - } - return true; - } - - /* -------------------------------------------------------------------------------- - Test run helpers - */ - public static void log_output(String test_name ,String stream ,String output_data){ - try(FileWriter log_writer = new FileWriter("test_log.txt" ,true)){ // Append mode - log_writer.write("Test: " + test_name + "\n"); - log_writer.write("Stream: " + stream + "\n"); - log_writer.write("Output:\n" + output_data + "\n"); - log_writer.write("----------------------------------------\n"); - } catch(IOException e) { - System.err.println("Error writing to log for test: " + test_name + ", stream: " + stream); - e.printStackTrace(System.err); - } - } - - public static boolean method_is_wellformed(Method method) { - // Check if the method returns boolean - if(!method.getReturnType().equals(boolean.class)){ - System.out.println("Structural problem: " + method.getName() + " does not return boolean."); - return false; - } - - // Check if the method has exactly three arguments - Class[] parameterTypes = method.getParameterTypes(); - if(parameterTypes == null || parameterTypes.length != 3){ - System.out.println("Structural problem: " + method.getName() + " does not have three arguments."); - return false; - } - - // Check that all parameters are ByteArrayOutputStream - if( - !parameterTypes[0].equals(ByteArrayOutputStream.class) // Check first parameter - || !parameterTypes[1].equals(ByteArrayOutputStream.class) // Check second parameter - || !parameterTypes[2].equals(ByteArrayOutputStream.class) // Check third parameter - ){ - System.out.println("Structural problem: " + method.getName() + " has incorrect argument types."); - return false; - } - - return true; - } - - public static void flush_stdin() throws IOException{ - while(System.in.available() > 0){ - System.in.read(); - } - } - - public static void set_test_input(String input_data){ - ByteArrayInputStream test_in = new ByteArrayInputStream(input_data.getBytes()); - System.setIn(test_in); - } - - - public static void run(Object test_suite){ - - int failed_test = 0; - int passed_test = 0; - - Method[] methods = test_suite.getClass().getDeclaredMethods(); - - for(Method method : methods){ - - // Ways a test can fail ,not exclusive - boolean fail_testbench = false; - boolean fail_malformed = false; - boolean fail_reported = false; - boolean fail_exception = false; - boolean fail_extraneous_stdout = false; - boolean fail_extraneous_stderr = false; - - if( !method_is_wellformed(method) ){ - // the malformed check prints specific messages - System.out.println("TestBench: malformed test counted as a failure:\'" + method.getName() + "\'"); - failed_test++; - continue; - } - - PrintStream original_out = null; - PrintStream original_err = null; - InputStream original_in = null; - - ByteArrayOutputStream out_content = null; - ByteArrayOutputStream err_content = null; - ByteArrayInputStream in_content = null; - - try{ - // Redirect the I/O channels so the tests can manipulate them as data. - original_out = System.out; - original_err = System.err; - original_in = System.in; - - out_content = new ByteArrayOutputStream(); - err_content = new ByteArrayOutputStream(); - in_content = new ByteArrayInputStream(); - - System.setOut(new PrintStream(out_content)); - System.setErr(new PrintStream(err_content)); - System.setIn(in_content); - - } catch(Throwable e){ // Catches both Errors and Exceptions - // Restore stdout ,stderr ,and stdin before reporting the error - System.setOut(original_out); - System.setErr(original_err); - System.setIn(original_in); - - // Report the error - System.out.println("TestBench:: when redirecting i/o in preparation for running test \'" + method.getName() + "\' ,test bench itself throws error: " + e.toString()); - failed_test++; - continue; - } - - // Capture detritus - String exception_string = ""; - String stdout_string = ""; - String stderr_string = ""; - - // Finally the gremlins run the test! - try{ - - Object result = method.invoke(test_suite ,in_content ,out_content ,err_content); - fail_reported = !Boolean.TRUE.equals(result); // test passes if ,and only if ,it returns exactly 'true'. - - // A test fails when there is extraneous output - fail_extraneous_stdout = out_content.size() > 0; - fail_extraneous_stderr = err_content.size() > 0; - - // We keep it to log it - if(fail_extraneous_stdout){ stdout_string = out_content.toString(); } - if(fail_extraneous_stderr){ stderr_string = err_content.toString(); } - - } catch(Exception e){ - - // A test fails when there is an unhandled exception. - fail_exception = true; - - // We keep it to report it - exception_string = e.toString(); - - } finally{ - - // Restore original stdin ,stdout ,and stderr - System.setOut(original_out); - System.setErr(original_err); - System.setIn(original_in); - } - - // Report the test result. - if( - fail_reported - || fail_exception - || fail_extraneous_stdout - || fail_extraneous_stderr - ){ - - failed_test++; - - if(fail_reported) System.out.println("failed: \'" + method.getName() + "\' by report from test."); - if(fail_exception) System.out.println("failed: \'" + method.getName() + "\' due to unhandled exception: " + exception_string); - if(fail_extraneous_stdout){ - System.out.println("failed: \'" + method.getName() + "\' due extraneous stdout output ,see log."); - log_output(method.getName() ,"stdout" ,stdout_string); - } - if(fail_extraneous_stderr){ - System.out.println("failed: \'" + method.getName() + "\' due extraneous stderr output ,see log."); - log_output(method.getName() ,"stderr" ,stderr_string); - } - - } else{ - passed_test++; - } - - } - - // Summarize all the test results - System.out.println("Total tests run: " + (passed_test + failed_test)); - System.out.println("Total tests passed: " + passed_test); - System.out.println("Total tests failed: " + failed_test); - } - -} diff --git a/tester/javac/TestTestBench.java b/tester/javac/TestTestBench.java deleted file mode 100644 index f9af752..0000000 --- a/tester/javac/TestTestBench.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.ReasoningTechnology.TestBench; - -/* -Component smoke test. At least call each method of each class. - -*/ - -import com.ReasoningTechnology.Ariadne.*; -import com.ReasoningTechnology.TestBench.*; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; - -public class TestTestBench extends TestBench{ - - public static class TestSuite{ - - TestSuite(){ - } - - public boolean test_pass(ByteArrayOutputStream out_content, ByteArrayOutputStream err_content){ - return true; - } - - public boolean test_fail_0(ByteArrayOutputStream out_content, ByteArrayOutputStream err_content){ - return false; - } - - // Tests if exception uncaught by the test correctly causes a failure from the TestBench. - public static boolean test_fail_1() throws Exception { - int randomInt = (int) (Math.random() * 100); // Generate a random integer - // Always returns true, but Java will not complain that following code is unreachable - if( - (randomInt % 2 != 0 && ((randomInt * randomInt - 1) % 8 == 0)) - || (randomInt % 2 == 0 && (randomInt * randomInt) % 4 == 0) - ){ - throw new Exception("Condition met, error thrown."); - } - - return true; // If the condition fails, return true - } - - } - - // Method to run all tests - public static void test_TestBench(){ - System.out.println("TestTestBench: running tests. Note that two failures is normal"); - TestSuite test_suite = new TestSuite(); - TestBench.run( test_suite ); - } - - // Main function to provide a shell interface for running tests - public static void main(String[] args){ - // tests currently takes no arguments or options - test_TestBench(); // Calls the method to run all tests - } - -} - diff --git a/tester/javac/Test_File_0.java b/tester/javac/Test_File_0.java new file mode 100644 index 0000000..383544d --- /dev/null +++ b/tester/javac/Test_File_0.java @@ -0,0 +1,109 @@ + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.FileTime; +import java.util.List; +import java.util.Map; + +import com.ReasoningTechnology.Ariadne.File; +import com.ReasoningTechnology.Mosaic.*; + +public class Test_File_0{ + + public class TestSuite{ + + public Boolean unpack_file_path_0(IO io){ + Boolean[] conditions = new Boolean[5]; + int i = 0; + + // Test input + String test_fp = "/home/user/test.txt"; + + // Expected output + String expected_dp = "/home/user/"; + String expected_fn = "test.txt"; + String expected_fn_base = "test"; + String expected_fn_ext = "txt"; + + // Actual output + Map result = File.unpack_file_path( test_fp ); + + conditions[i++] = result.get("dp").equals( expected_dp ); + conditions[i++] = result.get("fn").equals( expected_fn ); + conditions[i++] = result.get("fn_base").equals( expected_fn_base ); + conditions[i++] = result.get("fn_ext").equals( expected_fn_ext ); + conditions[i++] = result.size() == 4; + + // Return true if all conditions are met + return MU.all( conditions ); + } + + public Boolean file_exists_q_0(IO io) { + Boolean[] conditions = new Boolean[2]; + int i = 0; + + // Test file paths, assuming $REPO_HOME is set in the environment + String repoHome = System.getenv("REPO_HOME"); + String existingFilePath = repoHome + "/tester/data_Test_File_0/I_exist"; + String nonExistentFilePath = repoHome + "/tester/data_Test_File_0/I_do_not_exist"; + + // Test cases + conditions[i++] = File.file_exists_q(existingFilePath); // Expect true for existing file + conditions[i++] = !File.file_exists_q(nonExistentFilePath); // Expect false for non-existent file + + // Return true if both conditions are met + return MU.all(conditions); + } + + public Boolean newer_than_all_0(IO io) throws IOException { + Boolean[] conditions = new Boolean[5]; + int i = 0; + + String repoHome = System.getenv("REPO_HOME"); + + // Define paths for existing and missing files + String file_0 = repoHome + "/tester/data_Test_File_0/file_0"; + String file_1 = repoHome + "/tester/data_Test_File_0/file_1"; + String file_2 = repoHome + "/tester/data_Test_File_0/file_2"; + String file_3 = repoHome + "/tester/data_Test_File_0/file_3"; + String missing_file_0 = repoHome + "/tester/data_Test_File_0/missing_file_0"; + + // Set modification times: file_0 is the youngest, file_3 is the oldest + Files.setLastModifiedTime(Paths.get(file_3), FileTime.fromMillis(System.currentTimeMillis() - 20000)); + Files.setLastModifiedTime(Paths.get(file_2), FileTime.fromMillis(System.currentTimeMillis() - 15000)); + Files.setLastModifiedTime(Paths.get(file_1), FileTime.fromMillis(System.currentTimeMillis() - 10000)); + Files.setLastModifiedTime(Paths.get(file_0), FileTime.fromMillis(System.currentTimeMillis() - 5000)); + + // Test case 1: file_0 is newer than all other files + conditions[i++] = File.newer_than_all(file_0, List.of(file_1, file_2, file_3)); // Expect true + + // Test case 2: file_0 is newer than some, but not all (make file_2 newer) + Files.setLastModifiedTime(Paths.get(file_2), FileTime.fromMillis(System.currentTimeMillis() + 10000)); // file_2 is now newer + conditions[i++] = !File.newer_than_all(file_0, List.of(file_1, file_2, file_3)); // Expect false + + // Test case 3: file_0 is not newer than any (make both file_1 and file_2 newer) + Files.setLastModifiedTime(Paths.get(file_1), FileTime.fromMillis(System.currentTimeMillis() + 15000)); + conditions[i++] = !File.newer_than_all(file_0, List.of(file_1, file_2, file_3)); // Expect false + + // Test case 4: file_0 does not exist + conditions[i++] = !File.newer_than_all(missing_file_0, List.of(file_1, file_2, file_3)); // Expect false + + // Test case 5: Some files in the list are missing + conditions[i++] = !File.newer_than_all(file_0, List.of(file_1, missing_file_0)); // Expect false + + // Return true if all conditions pass + return MU.all(conditions); + } + + } + + public static void main(String[] args) { + TestSuite suite = new Test_File_0().new TestSuite(); + int result = TestBench.run(suite); + System.exit(result); + } + +} + diff --git a/tester/javac/Test_LabelList_0.java b/tester/javac/Test_LabelList_0.java new file mode 100644 index 0000000..ce17cd6 --- /dev/null +++ b/tester/javac/Test_LabelList_0.java @@ -0,0 +1,37 @@ +import java.util.List; +import java.util.Arrays; + +import com.ReasoningTechnology.Ariadne.Label; +import com.ReasoningTechnology.Ariadne.LabelList; +import com.ReasoningTechnology.Mosaic.*; + +public class Test_LabelList_0 { + + public class TestSuite { + + public Boolean labelList_creation_0(IO io) { + Boolean[] conditions = new Boolean[2]; + int i = 0; + + // Test the default constructor + LabelList emptyList = new LabelList(); + conditions[i++] = emptyList.isEmpty(); // Expect true for an empty list + + // Test the constructor with a list of labels + List