wrong 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|