predicated 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.
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