predicated 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 +183 -1
- data/lib/predicated.rb +1 -3
- data/lib/predicated/constrain.rb +2 -0
- data/lib/predicated/evaluate.rb +25 -6
- data/lib/predicated/from/callable_object.rb +7 -8
- data/lib/predicated/from/json.rb +59 -0
- data/lib/predicated/from/{ruby_string.rb → ruby_code_string.rb} +13 -5
- data/lib/predicated/from/{url_fragment.rb → url_part.rb} +17 -10
- data/lib/predicated/from/xml.rb +61 -0
- data/lib/predicated/predicate.rb +62 -43
- data/lib/predicated/print.rb +28 -16
- data/lib/predicated/selectable.rb +102 -0
- data/lib/predicated/simple_templated_predicate.rb +79 -0
- data/lib/predicated/string_utils.rb +20 -0
- data/lib/predicated/to/arel.rb +28 -22
- data/lib/predicated/to/json.rb +48 -0
- data/lib/predicated/to/sentence.rb +17 -14
- data/lib/predicated/to/solr.rb +15 -0
- data/lib/predicated/to/xml.rb +67 -0
- data/lib/predicated/version.rb +2 -2
- data/test/canonical_transform_cases.rb +67 -0
- data/test/constrain_test.rb +20 -11
- data/test/enumerable_test.rb +6 -34
- data/test/equality_test.rb +15 -4
- data/test/evaluate_test.rb +31 -26
- data/test/from/callable_object_canonical_test.rb +43 -0
- data/test/from/callable_object_test.rb +16 -40
- data/test/from/json_test.rb +83 -0
- data/test/from/ruby_code_string_canonical_test.rb +37 -0
- data/test/from/ruby_code_string_test.rb +103 -0
- data/test/from/{url_fragment_parser_test.rb → url_part_parser_test.rb} +20 -13
- data/test/from/url_part_test.rb +48 -0
- data/test/from/xml_test.rb +57 -0
- data/test/json_conversion_test.rb +33 -0
- data/test/print_test.rb +26 -25
- data/test/selectable_test.rb +123 -0
- data/test/simple_templated_predicate_test.rb +39 -0
- data/test/suite.rb +2 -4
- data/test/test_helper.rb +26 -4
- data/test/test_helper_with_wrong.rb +3 -2
- data/test/to/arel_test.rb +71 -31
- data/test/to/json_test.rb +74 -0
- data/test/to/sentence_test.rb +41 -34
- data/test/to/solr_test.rb +39 -0
- data/test/to/xml_test.rb +72 -0
- data/test/xml_conversion_test.rb +34 -0
- metadata +44 -16
- data/lib/predicated/selector.rb +0 -55
- data/test/from/ruby_string_test.rb +0 -135
- data/test/from/url_fragment_test.rb +0 -37
- 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/
|
4
|
+
require "predicated/from/url_part"
|
5
5
|
include Predicated
|
6
6
|
|
7
|
-
|
7
|
+
regarding "parse a url part, the result is a parse tree" do
|
8
8
|
|
9
9
|
before do
|
10
|
-
@parser =
|
10
|
+
@parser = TreetopUrlPartParser.new
|
11
11
|
end
|
12
12
|
|
13
|
-
|
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::
|
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
|
-
|
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::
|
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
|
-
|
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::
|
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
|
-
|
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
|
-
|
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
|
data/test/print_test.rb
CHANGED
@@ -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
|
-
|
6
|
+
regarding "a predicate looks nice with you to_s it" do
|
7
7
|
test "numbers" do
|
8
|
-
assert { Predicate { Eq(1, 1) }.
|
9
|
-
assert { Predicate { 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) }.
|
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") }.
|
17
|
+
assert { Predicate { Eq("foo", "bar") }.to_s == "Eq('foo','bar')" }
|
18
18
|
end
|
19
19
|
|
20
|
-
|
21
|
-
|
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 {
|
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) }.
|
37
|
-
assert { Predicate { 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)) }.
|
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))) }.
|
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
|
-
|
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) }.
|
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))) }.
|
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
|