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