predicated 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README.markdown +183 -1
  2. data/lib/predicated.rb +1 -3
  3. data/lib/predicated/constrain.rb +2 -0
  4. data/lib/predicated/evaluate.rb +25 -6
  5. data/lib/predicated/from/callable_object.rb +7 -8
  6. data/lib/predicated/from/json.rb +59 -0
  7. data/lib/predicated/from/{ruby_string.rb → ruby_code_string.rb} +13 -5
  8. data/lib/predicated/from/{url_fragment.rb → url_part.rb} +17 -10
  9. data/lib/predicated/from/xml.rb +61 -0
  10. data/lib/predicated/predicate.rb +62 -43
  11. data/lib/predicated/print.rb +28 -16
  12. data/lib/predicated/selectable.rb +102 -0
  13. data/lib/predicated/simple_templated_predicate.rb +79 -0
  14. data/lib/predicated/string_utils.rb +20 -0
  15. data/lib/predicated/to/arel.rb +28 -22
  16. data/lib/predicated/to/json.rb +48 -0
  17. data/lib/predicated/to/sentence.rb +17 -14
  18. data/lib/predicated/to/solr.rb +15 -0
  19. data/lib/predicated/to/xml.rb +67 -0
  20. data/lib/predicated/version.rb +2 -2
  21. data/test/canonical_transform_cases.rb +67 -0
  22. data/test/constrain_test.rb +20 -11
  23. data/test/enumerable_test.rb +6 -34
  24. data/test/equality_test.rb +15 -4
  25. data/test/evaluate_test.rb +31 -26
  26. data/test/from/callable_object_canonical_test.rb +43 -0
  27. data/test/from/callable_object_test.rb +16 -40
  28. data/test/from/json_test.rb +83 -0
  29. data/test/from/ruby_code_string_canonical_test.rb +37 -0
  30. data/test/from/ruby_code_string_test.rb +103 -0
  31. data/test/from/{url_fragment_parser_test.rb → url_part_parser_test.rb} +20 -13
  32. data/test/from/url_part_test.rb +48 -0
  33. data/test/from/xml_test.rb +57 -0
  34. data/test/json_conversion_test.rb +33 -0
  35. data/test/print_test.rb +26 -25
  36. data/test/selectable_test.rb +123 -0
  37. data/test/simple_templated_predicate_test.rb +39 -0
  38. data/test/suite.rb +2 -4
  39. data/test/test_helper.rb +26 -4
  40. data/test/test_helper_with_wrong.rb +3 -2
  41. data/test/to/arel_test.rb +71 -31
  42. data/test/to/json_test.rb +74 -0
  43. data/test/to/sentence_test.rb +41 -34
  44. data/test/to/solr_test.rb +39 -0
  45. data/test/to/xml_test.rb +72 -0
  46. data/test/xml_conversion_test.rb +34 -0
  47. metadata +44 -16
  48. data/lib/predicated/selector.rb +0 -55
  49. data/test/from/ruby_string_test.rb +0 -135
  50. data/test/from/url_fragment_test.rb +0 -37
  51. data/test/selector_test.rb +0 -82
@@ -1,21 +1,21 @@
1
- require "test/test_helper_with_wrong"
1
+ require "./test/test_helper_with_wrong"
2
2
 
3
3
  require "predicated/predicate"
4
- require "predicated/from/url_fragment"
4
+ require "predicated/from/url_part"
5
5
  include Predicated
6
6
 
7
- apropos "parse a url fragment, the result is a parse tree" do
7
+ regarding "parse a url part, the result is a parse tree" do
8
8
 
9
9
  before do
10
- @parser = TreetopUrlFragmentParser.new
10
+ @parser = TreetopUrlPartParser.new
11
11
  end
12
12
 
13
- apropos "simple operations" do
13
+ regarding "simple operations" do
14
14
 
15
15
  test "parse" do
16
16
  tree = @parser.parse("a=1")
17
17
 
18
- assert{ tree.is_a?(Predicated::TreetopUrlFragment::OperationNode) }
18
+ assert{ tree.is_a?(Predicated::TreetopUrlPart::OperationNode) }
19
19
  assert{ [tree.left_text, tree.sign_text, tree.right_text] == ["a", "=", "1"] }
20
20
 
21
21
  tree = @parser.parse("a>1")
@@ -41,11 +41,11 @@ apropos "parse a url fragment, the result is a parse tree" do
41
41
 
42
42
  end
43
43
 
44
- apropos "simple and" do
44
+ regarding "simple and" do
45
45
  test "parse" do
46
46
  tree = @parser.parse("a=1&b=2")
47
-
48
- assert{ tree.is_a?(Predicated::TreetopUrlFragment::AndNode) }
47
+
48
+ assert{ tree.is_a?(Predicated::TreetopUrlPart::AndNode) }
49
49
  assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
50
50
  [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] ==
51
51
  [["a", "=", "1"], ["b", "=", "2"]] }
@@ -56,11 +56,11 @@ apropos "parse a url fragment, the result is a parse tree" do
56
56
  end
57
57
  end
58
58
 
59
- apropos "simple or" do
59
+ regarding "simple or" do
60
60
  test "parse" do
61
61
  tree = @parser.parse("a=1|b=2")
62
62
 
63
- assert{ tree.is_a?(Predicated::TreetopUrlFragment::OrNode) }
63
+ assert{ tree.is_a?(Predicated::TreetopUrlPart::OrNode) }
64
64
  assert{ [[tree.left.left_text, tree.left.sign_text, tree.left.right_text],
65
65
  [tree.right.left_text, tree.right.sign_text, tree.right.right_text]] ==
66
66
  [["a", "=", "1"], ["b", "=", "2"]] }
@@ -71,7 +71,7 @@ apropos "parse a url fragment, the result is a parse tree" do
71
71
  end
72
72
  end
73
73
 
74
- apropos "complex and/or" do
74
+ regarding "complex and/or" do
75
75
  test "many or's" do
76
76
  assert{ @parser.parse("a=1|b=2|c=3").to_predicate ==
77
77
  Predicate{ Or( Eq("a", "1"), Or(Eq("b", "2"),Eq("c", "3")) ) } }
@@ -91,7 +91,7 @@ apropos "parse a url fragment, the result is a parse tree" do
91
91
  end
92
92
  end
93
93
 
94
- apropos "parens (force higher precedence)" do
94
+ regarding "parens (force higher precedence)" do
95
95
  test "no effect" do
96
96
  str = "(a=1|b=2)|c=3"
97
97
  assert{ @parser.parse(str).to_predicate ==
@@ -113,4 +113,11 @@ apropos "parse a url fragment, the result is a parse tree" do
113
113
  end
114
114
  end
115
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
+
116
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
@@ -1,57 +1,58 @@
1
- require "test/test_helper_with_wrong"
1
+ require "./test/test_helper_with_wrong"
2
2
 
3
3
  require "predicated/predicate"
4
4
  include Predicated
5
5
 
6
- apropos "a predicate looks nice with you inspect it" do
6
+ regarding "a predicate looks nice with you to_s it" do
7
7
  test "numbers" do
8
- assert { Predicate { Eq(1, 1) }.inspect == "Eq(1,1)" }
9
- assert { Predicate { Lt(1, 2) }.inspect == "Lt(1,2)" }
8
+ assert { Predicate { Eq(1, 1) }.to_s == "Eq(1,1)" }
9
+ assert { Predicate { Lt(1, 2) }.to_s == "Lt(1,2)" }
10
10
  end
11
11
 
12
12
  test "booleans" do
13
- assert { Predicate { Eq(false, true) }.inspect == "Eq(false,true)" }
13
+ assert { Predicate { Eq(false, true) }.to_s == "Eq(false,true)" }
14
14
  end
15
15
 
16
16
  test "strings" do
17
- assert { Predicate { Eq("foo", "bar") }.inspect == "Eq('foo','bar')" }
17
+ assert { Predicate { Eq("foo", "bar") }.to_s == "Eq('foo','bar')" }
18
18
  end
19
19
 
20
- class Color
21
- attr_reader :name
22
- def initialize(name)
23
- @name = name
24
- end
25
-
26
- def to_s
27
- "name:#{@name}"
28
- end
20
+ test "nil" do
21
+ assert { Predicate { Eq("foo", nil) }.to_s == "Eq('foo',nil)" }
29
22
  end
30
-
23
+
31
24
  test "objects" do
32
- assert { Predicate { Eq(Color.new("red"), Color.new("blue")) }.inspect == "Eq(Color{'name:red'},Color{'name:blue'})" }
25
+ assert {
26
+ Predicate {
27
+ Eq(Color.new("red"), Color.new("blue"))
28
+ }.to_s == "Eq(Color{'name:red'},Color{'name:blue'})"
29
+ }
33
30
  end
34
31
 
35
32
  test "and, or" do
36
- assert { Predicate { And(true, false) }.inspect == "And(true,false)" }
37
- assert { Predicate { Or(true, false) }.inspect == "Or(true,false)" }
33
+ assert { Predicate { And(true, false) }.to_s == "And(true,false)" }
34
+ assert { Predicate { Or(true, false) }.to_s == "Or(true,false)" }
38
35
 
39
- assert { Predicate { And(Eq(1, 1) , Eq(2, 2)) }.inspect == "And(Eq(1,1),Eq(2,2))" }
36
+ assert { Predicate { And(Eq(1, 1) , Eq(2, 2)) }.to_s == "And(Eq(1,1),Eq(2,2))" }
40
37
 
41
- assert { Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.inspect == "And(Eq(1,1),Or(Eq(2,2),Eq(3,3)))" }
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))" }
42
43
  end
43
44
 
44
45
  end
45
46
 
46
- apropos "to_s is like inspect except it's multiline, so you see the tree structure" do
47
+ regarding "inspect is like to_s except it's multiline, so you see the tree structure" do
47
48
 
48
49
  test "an uncomplicated predicate prints on one line" do
49
- assert { Predicate { Eq(1, 1) }.to_s == "Eq(1,1)" }
50
+ assert { Predicate { Eq(1, 1) }.inspect == "Eq(1,1)" }
50
51
  end
51
52
 
52
53
  test "complex" do
53
54
  assert {
54
- Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.to_s ==
55
+ Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) }.inspect ==
55
56
  %{And(
56
57
  Eq(1,1),
57
58
  Or(
@@ -62,4 +63,4 @@ apropos "to_s is like inspect except it's multiline, so you see the tree structu
62
63
  }
63
64
  }
64
65
  end
65
- end
66
+ end
@@ -0,0 +1,123 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/selectable"
4
+
5
+ regarding "part one: selectors on an array (simple enumerable). proving them out more generally." do
6
+ before do
7
+ @arr = [1,2,"c",4,"e",6]
8
+ Predicated::Selectable.bless_enumerable(@arr,
9
+ :strings => proc{|item|item.is_a?(String)},
10
+ :numbers => proc{|item|item.is_a?(Numeric)},
11
+ :less_than_3 => proc{|item|item < 3}
12
+ )
13
+ end
14
+
15
+ test %{selection basics.
16
+ People often remark that this kind of thing is jQuery-like.
17
+ I keep thinking I got it from Eric Evans.} do
18
+ assert{ @arr.select(:numbers) == [1,2,4,6] }
19
+ assert{ @arr.select(:strings) == ["c","e"] }
20
+ assert{ @arr.select(:numbers).select(:less_than_3) == [1,2] }
21
+
22
+ assert do
23
+ rescuing{ @arr.select(:less_than_3) }.is_a?(ArgumentError)
24
+ #because strings don't respond to <
25
+ #...there's no substitute for knowing what you're doing.
26
+ end
27
+
28
+ #normal select still works
29
+ assert{ @arr.select{|item|item.is_a?(String)} == ["c","e"] }
30
+ end
31
+
32
+ test "...selector name can be any object" do
33
+ arr = [1,2,"c",4,"e",6]
34
+
35
+ Predicated::Selectable.bless_enumerable(arr,
36
+ String => proc{|item|item.is_a?(String)},
37
+ Numeric => proc{|item|item.is_a?(Numeric)},
38
+ :less_than_3 => proc{|item|item < 3}
39
+ )
40
+
41
+ assert{ arr.select(String) == ["c","e"] }
42
+ assert{ arr.select(Numeric) == [1,2,4,6] }
43
+ assert{ arr.select(Numeric).select(:less_than_3) == [1,2] }
44
+ end
45
+
46
+ test "chaining. also works using varargs" do
47
+ assert{ @arr.select(:numbers).select(:less_than_3) == [1,2] }
48
+ assert{ @arr.select(:numbers, :less_than_3) == [1,2] }
49
+ end
50
+
51
+ test "extending twice is additive (not destructive)" do
52
+ arr = [1,2,"c",4,"e",6]
53
+ Predicated::Selectable.bless_enumerable(arr, :strings => proc{|item|item.is_a?(String)})
54
+ Predicated::Selectable.bless_enumerable(arr, :numbers => proc{|item|item.is_a?(Numeric)})
55
+
56
+ assert{ arr.select(:strings) == ["c","e"] }
57
+ assert{ arr.select(:numbers) == [1,2,4,6] }
58
+ end
59
+
60
+ test "works as a macro" do
61
+ class MyArray < Array
62
+ include Predicated::Selectable
63
+ selector :strings => proc{|item|item.is_a?(String)}
64
+ selector :numbers => proc{|item|item.is_a?(Numeric)}
65
+ selector :small => proc{|item|item.is_a?(Numeric) && item < 3},
66
+ :big => proc{|item|item.is_a?(Numeric) && item >= 3}
67
+ end
68
+
69
+ arr = MyArray.new
70
+ arr.replace([1,2,"c",4,"e",6])
71
+
72
+ assert{ arr.select(:strings) == ["c","e"] }
73
+ assert{ arr.select(:numbers) == [1,2,4,6] }
74
+ assert{ arr.select(:small) == [1,2] }
75
+ assert{ arr.select(:big) == [4,6] }
76
+ end
77
+
78
+ test %{memoizes.
79
+ Selector enumerable assumes an immutable collection.
80
+ I'm going to use that assumption against it, and cleverly prove that memoization works.
81
+ (Others might choose to mock in similar circumstances.)} do
82
+ assert{ @arr.select(:strings) == ["c","e"] }
83
+
84
+ @arr << "zzz"
85
+
86
+ assert{ @arr.select(:strings) == ["c","e"] }
87
+ end
88
+ end
89
+
90
+ include Predicated
91
+ regarding "there are convenient selectors defined for getting things out of a predicate" do
92
+ class ::Array
93
+ def predicates
94
+ collect{|p, a|p}
95
+ end
96
+ end
97
+
98
+ it "gets predicate parts by type" do
99
+ root = Predicate { And(Eq(1, 2), Or(Eq(3, 4), Eq(5, 6))) }
100
+ the_or = Predicate { Or(Eq(3, 4), Eq(5, 6)) }
101
+
102
+ assert{ root.select(:all).predicates == [root, Equal.new(1, 2), the_or, Equal.new(3, 4), Equal.new(5, 6)] }
103
+
104
+ assert{ root.select(And).predicates == [root] }
105
+ assert{ root.select(Or).predicates == [the_or] }
106
+ assert{ root.select(Equal).predicates == [Equal.new(1, 2), Equal.new(3, 4), Equal.new(5, 6)] }
107
+ assert{ root.select(GreaterThan).predicates == [] }
108
+
109
+ gt_lt = Predicate { And(Gt(1, 2), Lt(3, 4)) }
110
+ assert{ gt_lt.select(GreaterThan).predicates == [GreaterThan.new(1, 2)] }
111
+ assert{ gt_lt.select(LessThan).predicates == [LessThan.new(3, 4)] }
112
+
113
+ gte_lte = Predicate { And(Gte(1, 2), Lte(3, 4)) }
114
+ assert{ gte_lte.select(GreaterThanOrEqualTo).predicates == [GreaterThanOrEqualTo.new(1, 2)] }
115
+ assert{ gte_lte.select(LessThanOrEqualTo).predicates == [LessThanOrEqualTo.new(3, 4)] }
116
+
117
+ mixed = Predicate { And(Eq(1, 2), Or(Gt(3, 4), Lt(5, 6))) }
118
+ mixed_or = Predicate { Or(Gt(3, 4), Lt(5, 6)) }
119
+ assert{ mixed.select(Operation).predicates == [Equal.new(1, 2), GreaterThan.new(3, 4), LessThan.new(5, 6)] }
120
+ assert{ mixed.select(Operation).select(Equal).predicates == [Equal.new(1, 2)] }
121
+ assert{ mixed.select(Binary).predicates == [mixed, Equal.new(1, 2), mixed_or, GreaterThan.new(3, 4), LessThan.new(5, 6)] }
122
+ end
123
+ end
@@ -0,0 +1,39 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/simple_templated_predicate"
4
+ include Predicated
5
+
6
+ regarding "simple templated predicates. the left sides of operations and calls is a common unbound variable" do
7
+
8
+ test "operations. the left side is a placeholder" do
9
+ assert{ SimpleTemplatedPredicate{ Eq(1) }.fill_in(1) == Predicate { Eq(1, 1) } }
10
+ assert{ SimpleTemplatedPredicate{ Lt(2) }.fill_in(1) == Predicate { Lt(1, 2) } }
11
+ assert{ SimpleTemplatedPredicate{ Gt(1) }.fill_in(2) == Predicate { Gt(2, 1) } }
12
+ assert{ SimpleTemplatedPredicate{ Gte(1) }.fill_in(2) == Predicate { Gte(2, 1) } }
13
+ assert{ SimpleTemplatedPredicate{ Lte(2) }.fill_in(1) == Predicate { Lte(1, 2) } }
14
+
15
+ assert{ SimpleTemplatedPredicate{ Eq(true) }.fill_in(true) == Predicate { Eq(true, true) } }
16
+ end
17
+
18
+ test "and, or, not. just pass on the fill_in" do
19
+ assert{ SimpleTemplatedPredicate{ And(Gt(3),Lt(5)) }.fill_in(4) == Predicate { And(Gt(4,3),Lt(4,5)) } }
20
+ assert{ SimpleTemplatedPredicate{ Or(Gt(3),Lt(5)) }.fill_in(4) == Predicate { Or(Gt(4,3),Lt(4,5)) } }
21
+ assert{ SimpleTemplatedPredicate{ Not(Gt(5)) }.fill_in(4) == Predicate { Not(Gt(4,5)) } }
22
+ end
23
+
24
+ test "call. left side is a placeholder" do
25
+ assert{ SimpleTemplatedPredicate{ Call(:include?, "bc") }.fill_in("abc") ==
26
+ Predicate { Call("abc", :include?, "bc") } }
27
+
28
+ assert{ SimpleTemplatedPredicate{ Call(:nil?) }.fill_in("abc") ==
29
+ Predicate { Call("abc", :nil?) } }
30
+ end
31
+
32
+ test "to_s and inspect" do
33
+ assert{ SimpleTemplatedPredicate{ Eq(1) }.inspect == "Eq(1)" }
34
+ assert{ SimpleTemplatedPredicate{ Eq(1) }.to_s == "Eq(1)" }
35
+
36
+ assert{ SimpleTemplatedPredicate{ Call(:include?, "bc") }.inspect == "Call(include?('bc'))" }
37
+ assert{ SimpleTemplatedPredicate{ Call(:include?, "bc") }.to_s == "Call(include?('bc'))" }
38
+ end
39
+ end