wrong 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +114 -25
 - data/lib/predicated/Gemfile +15 -0
 - data/lib/predicated/LICENSE +20 -0
 - data/lib/predicated/README.markdown +191 -0
 - data/lib/predicated/Rakefile +51 -0
 - data/lib/predicated/lib/predicated.rb +4 -0
 - data/lib/predicated/lib/predicated/autogen_call.rb +37 -0
 - data/lib/predicated/lib/predicated/constrain.rb +66 -0
 - data/lib/predicated/lib/predicated/evaluate.rb +94 -0
 - data/lib/predicated/lib/predicated/from/callable_object.rb +108 -0
 - data/lib/predicated/lib/predicated/from/json.rb +59 -0
 - data/lib/predicated/lib/predicated/from/ruby_code_string.rb +73 -0
 - data/lib/predicated/lib/predicated/from/url_part.rb +104 -0
 - data/lib/predicated/lib/predicated/from/xml.rb +61 -0
 - data/lib/predicated/lib/predicated/gem_check.rb +34 -0
 - data/lib/predicated/lib/predicated/predicate.rb +111 -0
 - data/lib/predicated/lib/predicated/print.rb +62 -0
 - data/lib/predicated/lib/predicated/selectable.rb +102 -0
 - data/lib/predicated/lib/predicated/simple_templated_predicate.rb +79 -0
 - data/lib/predicated/lib/predicated/string_utils.rb +20 -0
 - data/lib/predicated/lib/predicated/to/arel.rb +41 -0
 - data/lib/predicated/lib/predicated/to/json.rb +48 -0
 - data/lib/predicated/lib/predicated/to/sentence.rb +94 -0
 - data/lib/predicated/lib/predicated/to/solr.rb +15 -0
 - data/lib/predicated/lib/predicated/to/xml.rb +67 -0
 - data/lib/predicated/lib/predicated/version.rb +3 -0
 - data/lib/predicated/predicated.gemspec +22 -0
 - data/lib/predicated/test/autogen_call_test.rb +40 -0
 - data/lib/predicated/test/canonical_transform_cases.rb +63 -0
 - data/lib/predicated/test/constrain_test.rb +86 -0
 - data/lib/predicated/test/enumerable_test.rb +32 -0
 - data/lib/predicated/test/equality_test.rb +32 -0
 - data/lib/predicated/test/evaluate_test.rb +149 -0
 - data/lib/predicated/test/from/callable_object_canonical_test.rb +43 -0
 - data/lib/predicated/test/from/callable_object_test.rb +78 -0
 - data/lib/predicated/test/from/json_test.rb +83 -0
 - data/lib/predicated/test/from/ruby_code_string_canonical_test.rb +37 -0
 - data/lib/predicated/test/from/ruby_code_string_test.rb +103 -0
 - data/lib/predicated/test/from/url_part_parser_test.rb +123 -0
 - data/lib/predicated/test/from/url_part_test.rb +48 -0
 - data/lib/predicated/test/from/xml_test.rb +57 -0
 - data/lib/predicated/test/json_conversion_test.rb +33 -0
 - data/lib/predicated/test/print_test.rb +66 -0
 - data/lib/predicated/test/selectable_test.rb +123 -0
 - data/lib/predicated/test/simple_templated_predicate_test.rb +39 -0
 - data/lib/predicated/test/suite.rb +2 -0
 - data/lib/predicated/test/test_helper.rb +64 -0
 - data/lib/predicated/test/test_helper_with_wrong.rb +6 -0
 - data/lib/predicated/test/to/arel_test.rb +85 -0
 - data/lib/predicated/test/to/json_test.rb +74 -0
 - data/lib/predicated/test/to/sentence_test.rb +90 -0
 - data/lib/predicated/test/to/solr_test.rb +39 -0
 - data/lib/predicated/test/to/xml_test.rb +72 -0
 - data/lib/predicated/test/xml_conversion_test.rb +34 -0
 - data/lib/predicated/test_integration/arel_integration_test.rb +52 -0
 - data/lib/predicated/test_integration/canonical_integration_cases.rb +66 -0
 - data/lib/predicated/test_integration/schema.xml +83 -0
 - data/lib/predicated/test_integration/solr_integration_test.rb +71 -0
 - data/lib/predicated/test_integration/sqlite_db +0 -0
 - data/lib/predicated/test_integration/suite.rb +2 -0
 - data/lib/predicated/test_integration/usage_test.rb +252 -0
 - data/lib/wrong.rb +3 -1
 - data/lib/wrong/adapters/test_unit.rb +1 -3
 - data/lib/wrong/assert.rb +81 -24
 - data/lib/wrong/chunk.rb +145 -0
 - data/lib/wrong/message/string_diff.rb +2 -4
 - data/lib/wrong/message/test_context.rb +2 -2
 - data/lib/wrong/version.rb +2 -2
 - data/test/adapters/minitest_test.rb +16 -9
 - data/test/adapters/test_unit_test.rb +1 -1
 - data/test/assert_test.rb +90 -0
 - data/test/catch_raise_test.rb +2 -2
 - data/test/chunk_test.rb +236 -0
 - data/test/failures_test.rb +109 -74
 - data/test/message/array_diff_test.rb +35 -19
 - data/test/message/string_diff_test.rb +39 -15
 - data/test/message/test_context_text.rb +2 -2
 - data/test/test_helper.rb +25 -7
 - metadata +86 -33
 - data/test/basic_assert_test.rb +0 -38
 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "./test/canonical_transform_cases"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require "predicated/from/ruby_code_string"
         
     | 
| 
      
 5 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            regarding "ruby code string - canoical transform cases" do
         
     | 
| 
      
 8 
     | 
    
         
            +
              include CanonicalTransformCases
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              @expectations = {
         
     | 
| 
      
 11 
     | 
    
         
            +
                "simple operations" => {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  "eq" => Predicate.from_ruby_code_string("'a'==3"),
         
     | 
| 
      
 13 
     | 
    
         
            +
                  "gt" => Predicate.from_ruby_code_string("'a'>3"),
         
     | 
| 
      
 14 
     | 
    
         
            +
                  "lt" => Predicate.from_ruby_code_string("'a'<3"),
         
     | 
| 
      
 15 
     | 
    
         
            +
                  "gte" => Predicate.from_ruby_code_string("'a'>=3"),
         
     | 
| 
      
 16 
     | 
    
         
            +
                  "lte" => Predicate.from_ruby_code_string("'a'<=3")
         
     | 
| 
      
 17 
     | 
    
         
            +
                },
         
     | 
| 
      
 18 
     | 
    
         
            +
                "primitive types" => {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  "false" => Predicate.from_ruby_code_string("'a'==false"),
         
     | 
| 
      
 20 
     | 
    
         
            +
                  "true" => Predicate.from_ruby_code_string("'a'==true"),
         
     | 
| 
      
 21 
     | 
    
         
            +
                  "string" => Predicate.from_ruby_code_string("'a'=='yyy'"),
         
     | 
| 
      
 22 
     | 
    
         
            +
                },
         
     | 
| 
      
 23 
     | 
    
         
            +
                "not" => {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  "simple" => Predicate.from_ruby_code_string("!('a'==true)")
         
     | 
| 
      
 25 
     | 
    
         
            +
                },
         
     | 
| 
      
 26 
     | 
    
         
            +
                "simple and / or" => {
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #parens are necessary around AND's in solr in order to force precedence
         
     | 
| 
      
 28 
     | 
    
         
            +
                  "and" => Predicate.from_ruby_code_string("'a'==1 && 'b'==2"),
         
     | 
| 
      
 29 
     | 
    
         
            +
                  "or" => Predicate.from_ruby_code_string("'a'==1 || 'b'==2")
         
     | 
| 
      
 30 
     | 
    
         
            +
                },
         
     | 
| 
      
 31 
     | 
    
         
            +
                "complex and / or" => {
         
     | 
| 
      
 32 
     | 
    
         
            +
                  "or and" => Predicate.from_ruby_code_string("'a'==1 && 'b'==2 || 'c'==3")
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              create_canonical_tests(@expectations)
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,103 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "predicated/from/ruby_code_string"
         
     | 
| 
      
 4 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            regarding "parse a ruby predicate string" do
         
     | 
| 
      
 7 
     | 
    
         
            +
              
         
     | 
| 
      
 8 
     | 
    
         
            +
              regarding "basic operations" do
         
     | 
| 
      
 9 
     | 
    
         
            +
                
         
     | 
| 
      
 10 
     | 
    
         
            +
                #'Wrong'-style asserts are specifically avoided here.
         
     | 
| 
      
 11 
     | 
    
         
            +
                #the circularity between the two projects will make you crazy if you're not careful
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
                test "word and" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("1==1 and 2==2"), Predicate{ And(Eq(1,1),Eq(2,2)) }
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                test "substitute in from the binding" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  a = 1
         
     | 
| 
      
 19 
     | 
    
         
            +
                  b = "1"
         
     | 
| 
      
 20 
     | 
    
         
            +
                  c = "c"
         
     | 
| 
      
 21 
     | 
    
         
            +
                  d = Color.new("purple")
         
     | 
| 
      
 22 
     | 
    
         
            +
                  
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("a==1", binding()), Predicate{ Eq(1,1) }
         
     | 
| 
      
 24 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("b==1", binding()), Predicate{ Eq("1",1) }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("c==b", binding()), Predicate{ Eq("c","1") }
         
     | 
| 
      
 26 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("d==d", binding()), Predicate{ Eq(Color.new("purple"),
         
     | 
| 
      
 27 
     | 
    
         
            +
                                                                          Color.new("purple")) }
         
     | 
| 
      
 28 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("d==d", binding()).left, d
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("a==b && b==c", binding()), 
         
     | 
| 
      
 31 
     | 
    
         
            +
                            Predicate{ And(Eq(1,"1"),Eq("1","c")) }
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                test "parens change precedence" do
         
     | 
| 
      
 36 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("1==1 || 2==2 && 3==3"),
         
     | 
| 
      
 37 
     | 
    
         
            +
                               Predicate{ Or( Eq(1,1), And(Eq(2,2),Eq(3,3)) ) }
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("(1==1 || 2==2) && 3==3"), 
         
     | 
| 
      
 40 
     | 
    
         
            +
                               Predicate{ And( Or(Eq(1,1),Eq(2,2)), Eq(3,3) ) }
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
                
         
     | 
| 
      
 43 
     | 
    
         
            +
                regarding "only pay attention to the final line" do
         
     | 
| 
      
 44 
     | 
    
         
            +
                  #might hate myself one day for this.  but what else does it make sense to do?
         
     | 
| 
      
 45 
     | 
    
         
            +
                  
         
     | 
| 
      
 46 
     | 
    
         
            +
                  test "simple" do
         
     | 
| 
      
 47 
     | 
    
         
            +
                    assert_equal Predicate.from_ruby_code_string("z=2\nb=5\n1==1"), Predicate{ Eq(1,1) }
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  test "can make use of variables defined earlier in the block" do
         
     | 
| 
      
 51 
     | 
    
         
            +
                    #might hate myself one day for this.  but what else does it make sense to do?
         
     | 
| 
      
 52 
     | 
    
         
            +
                    assert_equal Predicate.from_ruby_code_string("z=2\nb=5\nz==1"), Predicate{ Eq(2,1) }
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
                
         
     | 
| 
      
 56 
     | 
    
         
            +
                test "a call that returns a boolean result" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("'abc'.include?('bc')"), 
         
     | 
| 
      
 58 
     | 
    
         
            +
                               Predicate{ Call("abc", :include?, "bc") }
         
     | 
| 
      
 59 
     | 
    
         
            +
                  
         
     | 
| 
      
 60 
     | 
    
         
            +
                  color = Color.new("purple")  
         
     | 
| 
      
 61 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("color.name.include?('rp')", binding()), 
         
     | 
| 
      
 62 
     | 
    
         
            +
                               Predicate{ Call("purple", :include?, "rp") }
         
     | 
| 
      
 63 
     | 
    
         
            +
                               
         
     | 
| 
      
 64 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("'abc'.nil?"), 
         
     | 
| 
      
 65 
     | 
    
         
            +
                               Predicate{ Call("abc", :nil?, nil) }
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                
         
     | 
| 
      
 68 
     | 
    
         
            +
                test "use of instance variables" do
         
     | 
| 
      
 69 
     | 
    
         
            +
                  @a = 1
         
     | 
| 
      
 70 
     | 
    
         
            +
                  
         
     | 
| 
      
 71 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("@a==1", binding()), Predicate{ Eq(1,1) }
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
                                        
         
     | 
| 
      
 74 
     | 
    
         
            +
                test "use of inline assignments" do
         
     | 
| 
      
 75 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("(a=2)==1 && a==1"), 
         
     | 
| 
      
 76 
     | 
    
         
            +
                               Predicate{ And(Eq(2,1), Eq(2,1)) }
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
                                        
         
     | 
| 
      
 79 
     | 
    
         
            +
                test "use of inline expressions" do
         
     | 
| 
      
 80 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("(2*1)==1"), 
         
     | 
| 
      
 81 
     | 
    
         
            +
                               Predicate{ Eq(2,1) }
         
     | 
| 
      
 82 
     | 
    
         
            +
                               
         
     | 
| 
      
 83 
     | 
    
         
            +
                  assert_equal Predicate.from_ruby_code_string("[2,1].first==1"), 
         
     | 
| 
      
 84 
     | 
    
         
            +
                               Predicate{ Eq(2,1) }
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
              
         
     | 
| 
      
 90 
     | 
    
         
            +
              regarding "errors" do
         
     | 
| 
      
 91 
     | 
    
         
            +
                test "can't parse" do
         
     | 
| 
      
 92 
     | 
    
         
            +
                  assert_raises(Racc::ParseError) do 
         
     | 
| 
      
 93 
     | 
    
         
            +
                    Predicate.from_ruby_code_string("bad ruby @@@@@****()(((")
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
                end  
         
     | 
| 
      
 96 
     | 
    
         
            +
                
         
     | 
| 
      
 97 
     | 
    
         
            +
                test "predicates only" do
         
     | 
| 
      
 98 
     | 
    
         
            +
                  assert_raises(Predicated::Predicate::DontKnowWhatToDoWithThisSexpError) do 
         
     | 
| 
      
 99 
     | 
    
         
            +
                    Predicate.from_ruby_code_string("a=1")
         
     | 
| 
      
 100 
     | 
    
         
            +
                  end
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
              end
         
     | 
| 
      
 103 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,123 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "predicated/predicate"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "predicated/from/url_part"
         
     | 
| 
      
 5 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            regarding "parse a url part, the result is a parse tree" do
         
     | 
| 
      
 8 
     | 
    
         
            +
              
         
     | 
| 
      
 9 
     | 
    
         
            +
              before do
         
     | 
| 
      
 10 
     | 
    
         
            +
                @parser = TreetopUrlPartParser.new
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              regarding "simple operations" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                
         
     | 
| 
      
 15 
     | 
    
         
            +
                test "parse" do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  tree = @parser.parse("a=1")
         
     | 
| 
      
 17 
     | 
    
         
            +
                  
         
     | 
| 
      
 18 
     | 
    
         
            +
                  assert{ tree.is_a?(Predicated::TreetopUrlPart::OperationNode) }      
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "=", "1"] }
         
     | 
| 
      
 20 
     | 
    
         
            +
                  
         
     | 
| 
      
 21 
     | 
    
         
            +
                  tree = @parser.parse("a>1")
         
     | 
| 
      
 22 
     | 
    
         
            +
                  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", ">", "1"] }
         
     | 
| 
      
 23 
     | 
    
         
            +
                  
         
     | 
| 
      
 24 
     | 
    
         
            +
                  tree = @parser.parse("a<1")
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "<", "1"] }
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  tree = @parser.parse("a>=1")
         
     | 
| 
      
 28 
     | 
    
         
            +
                  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", ">=", "1"] }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  tree = @parser.parse("a<=1")
         
     | 
| 
      
 31 
     | 
    
         
            +
                  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "<=", "1"] }
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
                
         
     | 
| 
      
 34 
     | 
    
         
            +
                test "...to predicate" do
         
     | 
| 
      
 35 
     | 
    
         
            +
                  assert{ @parser.parse("a=1").to_predicate == Predicate{Eq("a", "1")} }
         
     | 
| 
      
 36 
     | 
    
         
            +
                  assert{ @parser.parse("a>1").to_predicate == Predicate{Gt("a", "1")} }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  assert{ @parser.parse("a<1").to_predicate == Predicate{Lt("a", "1")} }
         
     | 
| 
      
 38 
     | 
    
         
            +
                  assert{ @parser.parse("a>=1").to_predicate == Predicate{Gte("a", "1")} }
         
     | 
| 
      
 39 
     | 
    
         
            +
                  assert{ @parser.parse("a<=1").to_predicate == Predicate{Lte("a", "1")} }
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              regarding "simple and" do
         
     | 
| 
      
 45 
     | 
    
         
            +
                test "parse" do
         
     | 
| 
      
 46 
     | 
    
         
            +
                  tree = @parser.parse("a=1&b=2")
         
     | 
| 
      
 47 
     | 
    
         
            +
                  
         
     | 
| 
      
 48 
     | 
    
         
            +
                  assert{ tree.is_a?(Predicated::TreetopUrlPart::AndNode) }      
         
     | 
| 
      
 49 
     | 
    
         
            +
                  assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
         
     | 
| 
      
 50 
     | 
    
         
            +
                           [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] == 
         
     | 
| 
      
 51 
     | 
    
         
            +
                           [["a", "=", "1"], ["b", "=", "2"]] }      
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
                
         
     | 
| 
      
 54 
     | 
    
         
            +
                test "...to predicate" do
         
     | 
| 
      
 55 
     | 
    
         
            +
                  assert{ @parser.parse("a=1&b=2").to_predicate == Predicate{ And( Eq("a", "1"),Eq("b", "2") ) } }
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              regarding "simple or" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                test "parse" do
         
     | 
| 
      
 61 
     | 
    
         
            +
                  tree = @parser.parse("a=1|b=2")
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                  assert{ tree.is_a?(Predicated::TreetopUrlPart::OrNode) }      
         
     | 
| 
      
 64 
     | 
    
         
            +
                  assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
         
     | 
| 
      
 65 
     | 
    
         
            +
                           [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] == 
         
     | 
| 
      
 66 
     | 
    
         
            +
                           [["a", "=", "1"], ["b", "=", "2"]] }      
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
                
         
     | 
| 
      
 69 
     | 
    
         
            +
                test "...to predicate" do
         
     | 
| 
      
 70 
     | 
    
         
            +
                  assert{ @parser.parse("a=1|b=2").to_predicate == Predicate{ Or( Eq("a", "1"),Eq("b", "2") ) } }
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
              
         
     | 
| 
      
 74 
     | 
    
         
            +
              regarding "complex and/or" do
         
     | 
| 
      
 75 
     | 
    
         
            +
                test "many or's" do
         
     | 
| 
      
 76 
     | 
    
         
            +
                  assert{ @parser.parse("a=1|b=2|c=3").to_predicate == 
         
     | 
| 
      
 77 
     | 
    
         
            +
                    Predicate{ Or( Eq("a", "1"), Or(Eq("b", "2"),Eq("c", "3")) ) } }
         
     | 
| 
      
 78 
     | 
    
         
            +
                end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                test "many and's" do
         
     | 
| 
      
 81 
     | 
    
         
            +
                  assert{ @parser.parse("a=1&b=2&c=3").to_predicate == 
         
     | 
| 
      
 82 
     | 
    
         
            +
                    Predicate{ And( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
         
     | 
| 
      
 83 
     | 
    
         
            +
                end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
                test "mixed and/or" do
         
     | 
| 
      
 86 
     | 
    
         
            +
                  assert{ @parser.parse("a=1|b=2&c=3").to_predicate == 
         
     | 
| 
      
 87 
     | 
    
         
            +
                    Predicate{ Or( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                  assert{ @parser.parse("a=1&b=2|c=3").to_predicate == 
         
     | 
| 
      
 90 
     | 
    
         
            +
                    Predicate{ Or( And(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
         
     | 
| 
      
 91 
     | 
    
         
            +
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
              end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              regarding "parens (force higher precedence)" do
         
     | 
| 
      
 95 
     | 
    
         
            +
                test "no effect" do
         
     | 
| 
      
 96 
     | 
    
         
            +
                  str = "(a=1|b=2)|c=3"
         
     | 
| 
      
 97 
     | 
    
         
            +
                  assert{ @parser.parse(str).to_predicate == 
         
     | 
| 
      
 98 
     | 
    
         
            +
                    Predicate{ Or( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
         
     | 
| 
      
 99 
     | 
    
         
            +
                  
         
     | 
| 
      
 100 
     | 
    
         
            +
                  str = "((a=1|b=2))|c=3"
         
     | 
| 
      
 101 
     | 
    
         
            +
                  assert{ @parser.parse(str).to_predicate == 
         
     | 
| 
      
 102 
     | 
    
         
            +
                    Predicate{ Or( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                test "force precedence" do
         
     | 
| 
      
 106 
     | 
    
         
            +
                  #before
         
     | 
| 
      
 107 
     | 
    
         
            +
                  assert{ @parser.parse("a=1|b=2&c=3").to_predicate == 
         
     | 
| 
      
 108 
     | 
    
         
            +
                    Predicate{ Or( Eq("a", "1"), And(Eq("b", "2"),Eq("c", "3")) ) } }
         
     | 
| 
      
 109 
     | 
    
         
            +
                  
         
     | 
| 
      
 110 
     | 
    
         
            +
                  #after
         
     | 
| 
      
 111 
     | 
    
         
            +
                  assert{ @parser.parse("(a=1|b=2)&c=3").to_predicate == 
         
     | 
| 
      
 112 
     | 
    
         
            +
                    Predicate{ And( Or(Eq("a", "1"),Eq("b", "2")), Eq("c", "3") ) } }
         
     | 
| 
      
 113 
     | 
    
         
            +
                end
         
     | 
| 
      
 114 
     | 
    
         
            +
              end
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
              regarding "not" do
         
     | 
| 
      
 117 
     | 
    
         
            +
                test "force precedence" do
         
     | 
| 
      
 118 
     | 
    
         
            +
                  assert{ @parser.parse("!(a=1)").to_predicate == 
         
     | 
| 
      
 119 
     | 
    
         
            +
                    Predicate{ Not(Eq("a", "1")) } }
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
              end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,48 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "predicated/from/url_part"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "./test/canonical_transform_cases"
         
     | 
| 
      
 5 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            regarding "parse url parts and convert them into predicates" do
         
     | 
| 
      
 8 
     | 
    
         
            +
              include CanonicalTransformCases
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              @expectations = {
         
     | 
| 
      
 11 
     | 
    
         
            +
                "simple operations" => {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  "eq" => Predicate.from_url_part("a=3"),
         
     | 
| 
      
 13 
     | 
    
         
            +
                  "gt" => Predicate.from_url_part("a>3"),
         
     | 
| 
      
 14 
     | 
    
         
            +
                  "lt" => Predicate.from_url_part("a<3"),
         
     | 
| 
      
 15 
     | 
    
         
            +
                  "gte" => Predicate.from_url_part("a>=3"),
         
     | 
| 
      
 16 
     | 
    
         
            +
                  "lte" => Predicate.from_url_part("a<=3")
         
     | 
| 
      
 17 
     | 
    
         
            +
                },
         
     | 
| 
      
 18 
     | 
    
         
            +
                "primitive types" => {
         
     | 
| 
      
 19 
     | 
    
         
            +
                  "false" => Predicate.from_url_part("a=false"),
         
     | 
| 
      
 20 
     | 
    
         
            +
                  "true" => Predicate.from_url_part("a=true"),
         
     | 
| 
      
 21 
     | 
    
         
            +
                  "string" => Predicate.from_url_part("a=yyy"),
         
     | 
| 
      
 22 
     | 
    
         
            +
                },
         
     | 
| 
      
 23 
     | 
    
         
            +
                "not" => {
         
     | 
| 
      
 24 
     | 
    
         
            +
                  "simple" => Predicate.from_url_part("!(a=true)")
         
     | 
| 
      
 25 
     | 
    
         
            +
                },
         
     | 
| 
      
 26 
     | 
    
         
            +
                "simple and / or" => {
         
     | 
| 
      
 27 
     | 
    
         
            +
                  #parens are necessary around AND's in solr in order to force precedence
         
     | 
| 
      
 28 
     | 
    
         
            +
                  "and" => Predicate.from_url_part("a=1&b=2"),
         
     | 
| 
      
 29 
     | 
    
         
            +
                  "or" => Predicate.from_url_part("a=1|b=2")
         
     | 
| 
      
 30 
     | 
    
         
            +
                },
         
     | 
| 
      
 31 
     | 
    
         
            +
                "complex and / or" => {
         
     | 
| 
      
 32 
     | 
    
         
            +
                  "or and" => Predicate.from_url_part("a=1&b=2|c=3")
         
     | 
| 
      
 33 
     | 
    
         
            +
                }
         
     | 
| 
      
 34 
     | 
    
         
            +
              }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              create_canonical_tests(@expectations, proper_typing=false)
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              
         
     | 
| 
      
 40 
     | 
    
         
            +
              test "parens change precedence" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                assert { Predicate.from_url_part("a=1|b=2&c=3") == 
         
     | 
| 
      
 42 
     | 
    
         
            +
                  Predicate{ Or( Eq("a","1"), And(Eq("b","2"),Eq("c","3")) ) } }
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                assert { Predicate.from_url_part("(a=1|b=2)&c=3") == 
         
     | 
| 
      
 45 
     | 
    
         
            +
                  Predicate{ And( Or(Eq("a","1"),Eq("b","2")), Eq("c","3") ) } }
         
     | 
| 
      
 46 
     | 
    
         
            +
              end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,57 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "./test/canonical_transform_cases"
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require "predicated/from/xml"
         
     | 
| 
      
 5 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            regarding "convert an xml string to a predicate" do
         
     | 
| 
      
 8 
     | 
    
         
            +
              include CanonicalTransformCases
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              @expectations = {
         
     | 
| 
      
 11 
     | 
    
         
            +
                "simple operations" => {
         
     | 
| 
      
 12 
     | 
    
         
            +
                  "eq" => Predicate.from_xml("<equal><left>a</left><right>3</right></equal>"),
         
     | 
| 
      
 13 
     | 
    
         
            +
                  "gt" => Predicate.from_xml("<greaterThan><left>a</left><right>3</right></greaterThan>"),
         
     | 
| 
      
 14 
     | 
    
         
            +
                  "lt" => Predicate.from_xml("<lessThan><left>a</left><right>3</right></lessThan>"),
         
     | 
| 
      
 15 
     | 
    
         
            +
                  "gte" => 
         
     | 
| 
      
 16 
     | 
    
         
            +
                    Predicate.from_xml("<greaterThanOrEqualTo><left>a</left><right>3</right></greaterThanOrEqualTo>"),
         
     | 
| 
      
 17 
     | 
    
         
            +
                  "lte" => 
         
     | 
| 
      
 18 
     | 
    
         
            +
                    Predicate.from_xml("<lessThanOrEqualTo><left>a</left><right>3</right></lessThanOrEqualTo>")
         
     | 
| 
      
 19 
     | 
    
         
            +
                },
         
     | 
| 
      
 20 
     | 
    
         
            +
                "primitive types" => {
         
     | 
| 
      
 21 
     | 
    
         
            +
                  "false" => Predicate.from_xml("<equal><left>a</left><right>false</right></equal>"),
         
     | 
| 
      
 22 
     | 
    
         
            +
                  "true" => Predicate.from_xml("<equal><left>a</left><right>true</right></equal>"),
         
     | 
| 
      
 23 
     | 
    
         
            +
                  "string" => Predicate.from_xml("<equal><left>a</left><right>yyy</right></equal>"),
         
     | 
| 
      
 24 
     | 
    
         
            +
                },
         
     | 
| 
      
 25 
     | 
    
         
            +
                "not" => {
         
     | 
| 
      
 26 
     | 
    
         
            +
                  "simple" => Predicate.from_xml("<not><equal><left>a</left><right>true</right></equal></not>")
         
     | 
| 
      
 27 
     | 
    
         
            +
                },
         
     | 
| 
      
 28 
     | 
    
         
            +
                "simple and / or" => {
         
     | 
| 
      
 29 
     | 
    
         
            +
                  #parens are necessary around AND's in solr in order to force precedence
         
     | 
| 
      
 30 
     | 
    
         
            +
                  "and" => Predicate.from_xml(%{
         
     | 
| 
      
 31 
     | 
    
         
            +
                    <and>
         
     | 
| 
      
 32 
     | 
    
         
            +
                      <equal><left>a</left><right>1</right></equal>
         
     | 
| 
      
 33 
     | 
    
         
            +
                      <equal><left>b</left><right>2</right></equal>
         
     | 
| 
      
 34 
     | 
    
         
            +
                    </and>
         
     | 
| 
      
 35 
     | 
    
         
            +
                  }),
         
     | 
| 
      
 36 
     | 
    
         
            +
                  "or" => Predicate.from_xml(%{
         
     | 
| 
      
 37 
     | 
    
         
            +
                    <or>
         
     | 
| 
      
 38 
     | 
    
         
            +
                      <equal><left>a</left><right>1</right></equal>
         
     | 
| 
      
 39 
     | 
    
         
            +
                      <equal><left>b</left><right>2</right></equal>
         
     | 
| 
      
 40 
     | 
    
         
            +
                    </or>
         
     | 
| 
      
 41 
     | 
    
         
            +
                  })
         
     | 
| 
      
 42 
     | 
    
         
            +
                },
         
     | 
| 
      
 43 
     | 
    
         
            +
                "complex and / or" => {
         
     | 
| 
      
 44 
     | 
    
         
            +
                  "or and" => Predicate.from_xml(%{
         
     | 
| 
      
 45 
     | 
    
         
            +
                    <or>
         
     | 
| 
      
 46 
     | 
    
         
            +
                      <and>
         
     | 
| 
      
 47 
     | 
    
         
            +
                        <equal><left>a</left><right>1</right></equal>
         
     | 
| 
      
 48 
     | 
    
         
            +
                        <equal><left>b</left><right>2</right></equal>
         
     | 
| 
      
 49 
     | 
    
         
            +
                      </and>
         
     | 
| 
      
 50 
     | 
    
         
            +
                      <equal><left>c</left><right>3</right></equal>
         
     | 
| 
      
 51 
     | 
    
         
            +
                    </or>
         
     | 
| 
      
 52 
     | 
    
         
            +
                  })
         
     | 
| 
      
 53 
     | 
    
         
            +
                }
         
     | 
| 
      
 54 
     | 
    
         
            +
              }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              create_canonical_tests(@expectations, proper_typing=false)
         
     | 
| 
      
 57 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "predicated/from/json"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "predicated/to/json"
         
     | 
| 
      
 5 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            regarding "convert json back and forth" do
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              test "string to predicate to string" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                assert{ Predicate.from_json_str(%{["a","==",3]}).to_json_str == 
         
     | 
| 
      
 11 
     | 
    
         
            +
                          JSON.pretty_generate(JSON.parse(%{["a","==",3]})) }
         
     | 
| 
      
 12 
     | 
    
         
            +
                
         
     | 
| 
      
 13 
     | 
    
         
            +
                complex_json_str = %{
         
     | 
| 
      
 14 
     | 
    
         
            +
                  {
         
     | 
| 
      
 15 
     | 
    
         
            +
                    "or":[
         
     | 
| 
      
 16 
     | 
    
         
            +
                      {"and":[["a","==",1],["b","==",2]]},
         
     | 
| 
      
 17 
     | 
    
         
            +
                      ["c","==",3]
         
     | 
| 
      
 18 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 19 
     | 
    
         
            +
                  }
         
     | 
| 
      
 20 
     | 
    
         
            +
                }
         
     | 
| 
      
 21 
     | 
    
         
            +
                          
         
     | 
| 
      
 22 
     | 
    
         
            +
                assert{ Predicate.from_json_str(complex_json_str).to_json_str == 
         
     | 
| 
      
 23 
     | 
    
         
            +
                          JSON.pretty_generate(JSON.parse(complex_json_str)) }
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
              
         
     | 
| 
      
 26 
     | 
    
         
            +
              test "predicate to string to predicate" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                assert{ Predicate.from_json_str(Predicate{ Eq("a",3) }.to_json_str) == Predicate{ Eq("a",3) } }
         
     | 
| 
      
 28 
     | 
    
         
            +
                
         
     | 
| 
      
 29 
     | 
    
         
            +
                assert{ Predicate.from_json_str(Predicate{ Or(And(Eq("a",1),Eq("b",2)), Eq("c",3)) }.to_json_str) ==
         
     | 
| 
      
 30 
     | 
    
         
            +
                          Predicate{ Or(And(Eq("a",1),Eq("b",2)), Eq("c",3)) } }
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "./test/test_helper_with_wrong"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "predicated/predicate"
         
     | 
| 
      
 4 
     | 
    
         
            +
            include Predicated
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            regarding "a predicate looks nice with you to_s it" do
         
     | 
| 
      
 7 
     | 
    
         
            +
              test "numbers" do
         
     | 
| 
      
 8 
     | 
    
         
            +
                assert { Predicate { Eq(1, 1) }.to_s == "Eq(1,1)" }
         
     | 
| 
      
 9 
     | 
    
         
            +
                assert { Predicate { Lt(1, 2) }.to_s == "Lt(1,2)" }
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
              
         
     | 
| 
      
 12 
     | 
    
         
            +
              test "booleans" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                assert { Predicate { Eq(false, true) }.to_s == "Eq(false,true)" }
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
              test "strings" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                assert { Predicate { Eq("foo", "bar") }.to_s == "Eq('foo','bar')" }
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
              test "nil" do
         
     | 
| 
      
 21 
     | 
    
         
            +
                assert { Predicate { Eq("foo", nil) }.to_s == "Eq('foo',nil)" }
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              test "objects" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                assert {
         
     | 
| 
      
 26 
     | 
    
         
            +
                  Predicate {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    Eq(Color.new("red"), Color.new("blue"))
         
     | 
| 
      
 28 
     | 
    
         
            +
                  }.to_s == "Eq(Color{'name:red'},Color{'name:blue'})"
         
     | 
| 
      
 29 
     | 
    
         
            +
                }
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              test "and, or" do
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert { Predicate { And(true, false) }.to_s == "And(true,false)" }
         
     | 
| 
      
 34 
     | 
    
         
            +
                assert { Predicate { Or(true, false) }.to_s == "Or(true,false)" }
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                assert { Predicate { And(Eq(1, 1) , Eq(2, 2)) }.to_s == "And(Eq(1,1),Eq(2,2))" }
         
     | 
| 
      
 37 
     | 
    
         
            +
                
         
     | 
| 
      
 38 
     | 
    
         
            +
                assert { Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.to_s == "And(Eq(1,1),Or(Eq(2,2),Eq(3,3)))" }
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              test "not" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                assert { Predicate { Not(Eq(1, 1)) }.to_s == "Not(Eq(1,1))" }
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            end
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            regarding "inspect is like to_s except it's multiline, so you see the tree structure" do
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              test "an uncomplicated predicate prints on one line" do
         
     | 
| 
      
 50 
     | 
    
         
            +
                assert { Predicate { Eq(1, 1) }.inspect == "Eq(1,1)" }
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
              
         
     | 
| 
      
 53 
     | 
    
         
            +
              test "complex" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                assert { 
         
     | 
| 
      
 55 
     | 
    
         
            +
                  Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.inspect == 
         
     | 
| 
      
 56 
     | 
    
         
            +
            %{And(
         
     | 
| 
      
 57 
     | 
    
         
            +
              Eq(1,1),
         
     | 
| 
      
 58 
     | 
    
         
            +
              Or(
         
     | 
| 
      
 59 
     | 
    
         
            +
                Eq(2,2),
         
     | 
| 
      
 60 
     | 
    
         
            +
                Eq(3,3)
         
     | 
| 
      
 61 
     | 
    
         
            +
              )
         
     | 
| 
      
 62 
     | 
    
         
            +
            )
         
     | 
| 
      
 63 
     | 
    
         
            +
            }
         
     | 
| 
      
 64 
     | 
    
         
            +
                }
         
     | 
| 
      
 65 
     | 
    
         
            +
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
            end
         
     |