wrong 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 (80) hide show
  1. data/README.markdown +114 -25
  2. data/lib/predicated/Gemfile +15 -0
  3. data/lib/predicated/LICENSE +20 -0
  4. data/lib/predicated/README.markdown +191 -0
  5. data/lib/predicated/Rakefile +51 -0
  6. data/lib/predicated/lib/predicated.rb +4 -0
  7. data/lib/predicated/lib/predicated/autogen_call.rb +37 -0
  8. data/lib/predicated/lib/predicated/constrain.rb +66 -0
  9. data/lib/predicated/lib/predicated/evaluate.rb +94 -0
  10. data/lib/predicated/lib/predicated/from/callable_object.rb +108 -0
  11. data/lib/predicated/lib/predicated/from/json.rb +59 -0
  12. data/lib/predicated/lib/predicated/from/ruby_code_string.rb +73 -0
  13. data/lib/predicated/lib/predicated/from/url_part.rb +104 -0
  14. data/lib/predicated/lib/predicated/from/xml.rb +61 -0
  15. data/lib/predicated/lib/predicated/gem_check.rb +34 -0
  16. data/lib/predicated/lib/predicated/predicate.rb +111 -0
  17. data/lib/predicated/lib/predicated/print.rb +62 -0
  18. data/lib/predicated/lib/predicated/selectable.rb +102 -0
  19. data/lib/predicated/lib/predicated/simple_templated_predicate.rb +79 -0
  20. data/lib/predicated/lib/predicated/string_utils.rb +20 -0
  21. data/lib/predicated/lib/predicated/to/arel.rb +41 -0
  22. data/lib/predicated/lib/predicated/to/json.rb +48 -0
  23. data/lib/predicated/lib/predicated/to/sentence.rb +94 -0
  24. data/lib/predicated/lib/predicated/to/solr.rb +15 -0
  25. data/lib/predicated/lib/predicated/to/xml.rb +67 -0
  26. data/lib/predicated/lib/predicated/version.rb +3 -0
  27. data/lib/predicated/predicated.gemspec +22 -0
  28. data/lib/predicated/test/autogen_call_test.rb +40 -0
  29. data/lib/predicated/test/canonical_transform_cases.rb +63 -0
  30. data/lib/predicated/test/constrain_test.rb +86 -0
  31. data/lib/predicated/test/enumerable_test.rb +32 -0
  32. data/lib/predicated/test/equality_test.rb +32 -0
  33. data/lib/predicated/test/evaluate_test.rb +149 -0
  34. data/lib/predicated/test/from/callable_object_canonical_test.rb +43 -0
  35. data/lib/predicated/test/from/callable_object_test.rb +78 -0
  36. data/lib/predicated/test/from/json_test.rb +83 -0
  37. data/lib/predicated/test/from/ruby_code_string_canonical_test.rb +37 -0
  38. data/lib/predicated/test/from/ruby_code_string_test.rb +103 -0
  39. data/lib/predicated/test/from/url_part_parser_test.rb +123 -0
  40. data/lib/predicated/test/from/url_part_test.rb +48 -0
  41. data/lib/predicated/test/from/xml_test.rb +57 -0
  42. data/lib/predicated/test/json_conversion_test.rb +33 -0
  43. data/lib/predicated/test/print_test.rb +66 -0
  44. data/lib/predicated/test/selectable_test.rb +123 -0
  45. data/lib/predicated/test/simple_templated_predicate_test.rb +39 -0
  46. data/lib/predicated/test/suite.rb +2 -0
  47. data/lib/predicated/test/test_helper.rb +64 -0
  48. data/lib/predicated/test/test_helper_with_wrong.rb +6 -0
  49. data/lib/predicated/test/to/arel_test.rb +85 -0
  50. data/lib/predicated/test/to/json_test.rb +74 -0
  51. data/lib/predicated/test/to/sentence_test.rb +90 -0
  52. data/lib/predicated/test/to/solr_test.rb +39 -0
  53. data/lib/predicated/test/to/xml_test.rb +72 -0
  54. data/lib/predicated/test/xml_conversion_test.rb +34 -0
  55. data/lib/predicated/test_integration/arel_integration_test.rb +52 -0
  56. data/lib/predicated/test_integration/canonical_integration_cases.rb +66 -0
  57. data/lib/predicated/test_integration/schema.xml +83 -0
  58. data/lib/predicated/test_integration/solr_integration_test.rb +71 -0
  59. data/lib/predicated/test_integration/sqlite_db +0 -0
  60. data/lib/predicated/test_integration/suite.rb +2 -0
  61. data/lib/predicated/test_integration/usage_test.rb +252 -0
  62. data/lib/wrong.rb +3 -1
  63. data/lib/wrong/adapters/test_unit.rb +1 -3
  64. data/lib/wrong/assert.rb +81 -24
  65. data/lib/wrong/chunk.rb +145 -0
  66. data/lib/wrong/message/string_diff.rb +2 -4
  67. data/lib/wrong/message/test_context.rb +2 -2
  68. data/lib/wrong/version.rb +2 -2
  69. data/test/adapters/minitest_test.rb +16 -9
  70. data/test/adapters/test_unit_test.rb +1 -1
  71. data/test/assert_test.rb +90 -0
  72. data/test/catch_raise_test.rb +2 -2
  73. data/test/chunk_test.rb +236 -0
  74. data/test/failures_test.rb +109 -74
  75. data/test/message/array_diff_test.rb +35 -19
  76. data/test/message/string_diff_test.rb +39 -15
  77. data/test/message/test_context_text.rb +2 -2
  78. data/test/test_helper.rb +25 -7
  79. metadata +86 -33
  80. data/test/basic_assert_test.rb +0 -38
@@ -0,0 +1,86 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/predicate"
4
+ require "predicated/constrain"
5
+ include Predicated
6
+
7
+ regarding %{constraints are rules about the content and structure of predicates.
8
+ a predicate might violate a constraint} do
9
+
10
+ before do
11
+ @value_not_equal_to_two =
12
+ Constraint.new(:name => "Value can't be two",
13
+ :selectors => [Operation],
14
+ :check_that => proc{|predicate, ancestors| predicate.right!=2})
15
+
16
+ @not_more_than_two_levels_deep =
17
+ Constraint.new(:name => "Limited to two levels deep",
18
+ :check_that => proc{|predicate, ancestors| ancestors.length<=2})
19
+
20
+ @one = Predicate{Eq(1,1)}
21
+ @two = Predicate{Eq(2,2)}
22
+ @three = Predicate{Eq(3,3)}
23
+
24
+ @one_and_three = Predicate{And(Eq(1,1), Eq(3,3))}
25
+ @one_and_two = Predicate{And(Eq(1,1), Eq(2,2))}
26
+
27
+ @deeply_nested = Predicate{Or(Or(And(Eq(1,1), Eq(3,3)), Eq(4,4)), Eq(5,5))}
28
+ end
29
+
30
+ test "apply to each predicate - simple" do
31
+ constraints = Constraints.new.add(@value_not_equal_to_two)
32
+
33
+ assert{ constraints.check(@one).pass? }
34
+ deny { constraints.check(@two).pass? }
35
+
36
+ assert{ constraints.check(@one_and_three).pass? }
37
+ deny { constraints.check(@one_and_two).pass? }
38
+ end
39
+
40
+ test "apply each to each predicate - many constraints" do
41
+ constraints =
42
+ Constraints.new.
43
+ add(@value_not_equal_to_two).
44
+ add(@not_more_than_two_levels_deep)
45
+
46
+ assert{ constraints.check(@one_and_three).pass? }
47
+ deny { constraints.check(@one_and_two).pass? }
48
+
49
+ assert{ constraints.check(@one_and_three).pass? }
50
+ deny { constraints.check(@deeply_nested).pass? }
51
+ end
52
+
53
+ test "equality" do
54
+ one = Constraint.new(:name => "Value can't be two",
55
+ :selectors => [Operation],
56
+ :check_that => proc{|predicate, ancestors| predicate.right!=2})
57
+ two = Constraint.new(:name => "Value can't be two",
58
+ :selectors => [Operation],
59
+ :check_that => proc{|predicate, ancestors| predicate.right!=2})
60
+ three = Constraint.new(:name => "Some other constraint",
61
+ :check_that => proc{|predicate, ancestors| false})
62
+
63
+ assert{ one == two }
64
+ deny { one == three }
65
+ end
66
+
67
+ test %{result contains information about whether the checks passed,
68
+ which constraints were violated,
69
+ along with the offending predicates} do
70
+ constraints = Constraints.new.add(@value_not_equal_to_two)
71
+
72
+ result = constraints.check(@one)
73
+ assert{ result.pass? }
74
+ assert{ result.violations == {} }
75
+
76
+ result = constraints.check(Predicate{And(Eq(1,1), And(Eq(2,2), Eq(3,2)))})
77
+ deny { result.pass? }
78
+ assert{
79
+ result.violations == {
80
+ @value_not_equal_to_two => [Equal.new(2,2), Equal.new(3,2)]
81
+ }
82
+ }
83
+ end
84
+
85
+
86
+ end
@@ -0,0 +1,32 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/predicate"
4
+ include Predicated
5
+
6
+ regarding "you can flip through the predicate tree, like any enumerable. a list of ancestors of each node are provided" do
7
+
8
+ test "simple" do
9
+ assert { Predicate { Eq(1, 2) }.to_a == [[Predicate { Eq(1, 2) }, []]] }
10
+ end
11
+
12
+ test "complex" do
13
+ the_top = Predicate { And(Eq(1, 2), Or(Eq(3, 4), Eq(5, 6))) }
14
+ the_or = Predicate { Or(Eq(3, 4), Eq(5, 6)) }
15
+ assert { the_top.to_a ==
16
+ [
17
+ [the_top, []],
18
+ [Predicate { Eq(1, 2) }, [the_top]],
19
+ [Predicate { Or(Eq(3, 4), Eq(5, 6)) }, [the_top]],
20
+ [Predicate { Eq(3, 4) }, [the_top, the_or]],
21
+ [Predicate { Eq(5, 6) }, [the_top, the_or]]
22
+ ]
23
+ }
24
+ end
25
+
26
+ test "not" do
27
+ the_top = Predicate { Not(Eq(1, 2)) }
28
+ assert { the_top.to_a == [[the_top, []], [Predicate { Eq(1, 2) }, [the_top]]] }
29
+ end
30
+
31
+ end
32
+
@@ -0,0 +1,32 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/predicate"
4
+ include Predicated
5
+
6
+ regarding "prove value equality" do
7
+
8
+ test "simple" do
9
+ assert { Predicate { Eq(1, 1) } == Predicate { Eq(1, 1) } }
10
+ deny { Predicate { Eq(1, 1) } == Predicate { Eq(1, 99) } }
11
+ end
12
+
13
+ test "unary" do
14
+ assert { Predicate { Not(Eq(1, 1)) } == Predicate { Not(Eq(1, 1)) } }
15
+ deny { Predicate { Not(Eq(1, 1)) } == Predicate { Not(Eq(99, 99)) } }
16
+ end
17
+
18
+ test "complex" do
19
+ assert { Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) } ==
20
+ Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) } }
21
+
22
+ deny { Predicate { And(Eq(1, 1), Or(Eq(2, 2), Eq(3, 3))) } ==
23
+ Predicate { And(Eq(1, 1), Or(Eq(2, 99), Eq(3, 3))) } }
24
+ end
25
+
26
+ end
27
+
28
+ regarding "predicate base class. not sure I'm happy with the implementation...too tricky" do
29
+ test "all predicates descend from a predicate base class. it's a marker class" do
30
+ assert{ And.new(Equal.new(1,1),Equal.new(2,2)).is_a?(Predicate) }
31
+ end
32
+ end
@@ -0,0 +1,149 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/evaluate"
4
+ include Predicated
5
+
6
+ regarding "evaluate a predicate as boolean logic in ruby. change the context by providing and optional binding." do
7
+
8
+ regarding "proving out basic operations" do
9
+ test "equals" do
10
+ assert { Predicate { Eq(1, 1) }.evaluate }
11
+ deny { Predicate { Eq(1, 2) }.evaluate }
12
+ end
13
+
14
+ test "less than" do
15
+ assert { Predicate { Lt(1, 2) }.evaluate }
16
+ deny { Predicate { Lt(2, 2) }.evaluate }
17
+ deny { Predicate { Lt(3, 2) }.evaluate }
18
+ end
19
+
20
+ test "greater than" do
21
+ deny { Predicate { Gt(1, 2) }.evaluate }
22
+ deny { Predicate { Gt(2, 2) }.evaluate }
23
+ assert { Predicate { Gt(3, 2) }.evaluate }
24
+ end
25
+
26
+ test "less than or equal to" do
27
+ assert { Predicate { Lte(1, 2) }.evaluate }
28
+ assert { Predicate { Lte(2, 2) }.evaluate }
29
+ deny { Predicate { Lte(3, 2) }.evaluate }
30
+ end
31
+
32
+ test "greater than or equal to" do
33
+ deny { Predicate { Gte(1, 2) }.evaluate }
34
+ assert { Predicate { Gte(2, 2) }.evaluate }
35
+ assert { Predicate { Gte(3, 2) }.evaluate }
36
+ end
37
+ end
38
+
39
+ regarding "comparing values of different data types" do
40
+ test "strings" do
41
+ assert { Predicate { Eq("1", "1") }.evaluate }
42
+ deny { Predicate { Eq("1", 1) }.evaluate }
43
+ deny { Predicate { Eq("1", nil) }.evaluate }
44
+ end
45
+
46
+ test "booleans" do
47
+ assert { Predicate { Eq(true, true) }.evaluate }
48
+ deny { Predicate { Eq(false, true) }.evaluate }
49
+
50
+ deny { Predicate { Eq(false, nil) }.evaluate }
51
+ deny { Predicate { Eq(true, nil) }.evaluate }
52
+
53
+ deny { Predicate { Eq("false", false) }.evaluate }
54
+ deny { Predicate { Eq("true", true) }.evaluate }
55
+ end
56
+
57
+ test "numbers" do
58
+ assert { Predicate { Eq(1, 1) }.evaluate }
59
+ assert { Predicate { Eq(1, 1.0) }.evaluate }
60
+ assert { Predicate { Eq(1.0, 1.0) }.evaluate }
61
+ deny { Predicate { Eq(1, 2) }.evaluate }
62
+ deny { Predicate { Eq(1, nil) }.evaluate }
63
+ end
64
+
65
+ test "objects" do
66
+ assert { Predicate { Eq(Color.new("red"), Color.new("red")) }.evaluate }
67
+ deny { Predicate { Eq(Color.new("red"), Color.new("BLUE")) }.evaluate }
68
+ deny { Predicate { Eq(Color.new("red"), 2) }.evaluate }
69
+ deny { Predicate { Eq(Color.new("red"), "red") }.evaluate }
70
+ deny { Predicate { Eq(Color.new("red"), nil) }.evaluate }
71
+ end
72
+ end
73
+
74
+
75
+ regarding "and" do
76
+ test "left and right must be true" do
77
+ assert { Predicate { And( Eq(1, 1), Eq(2, 2) ) }.evaluate }
78
+ deny { Predicate { And( Eq(99, 1), Eq(2, 2) ) }.evaluate }
79
+ deny { Predicate { And( Eq(1, 1), Eq(99, 2) ) }.evaluate }
80
+ end
81
+
82
+ test "simple true and false work too" do
83
+ assert { Predicate { And( true, true ) }.evaluate }
84
+ assert { Predicate { And( true, Eq(2, 2) ) }.evaluate }
85
+ deny { Predicate { And( true, false ) }.evaluate }
86
+ deny { Predicate { And( Eq(2, 2), false ) }.evaluate }
87
+ end
88
+
89
+ test "nested" do
90
+ assert { Predicate { And( true, And(true, true) ) }.evaluate }
91
+ deny { Predicate { And( false, And(true, true) ) }.evaluate }
92
+ deny { Predicate { And( true, And(true, false) ) }.evaluate }
93
+ end
94
+ end
95
+
96
+ regarding "or" do
97
+ test "one of left or right must be true" do
98
+ assert { Predicate { Or(true, true) }.evaluate }
99
+ assert { Predicate { Or(true, false) }.evaluate }
100
+ assert { Predicate { Or(false, true) }.evaluate }
101
+ deny { Predicate { Or(false, false) }.evaluate }
102
+ end
103
+ end
104
+
105
+ regarding "not" do
106
+ test "simple negation" do
107
+ assert { Predicate { Not(Eq(3, 2)) }.evaluate }
108
+ deny { Predicate { Not(Eq(2, 2)) }.evaluate }
109
+ end
110
+
111
+ test "complex" do
112
+ assert { Predicate { Not( And(Eq(2, 2),false) ) }.evaluate }
113
+ deny { Predicate { Not( And(Eq(2, 2),true) ) }.evaluate }
114
+ end
115
+ end
116
+
117
+ regarding "evaluate adds a generic 'call' class. that is, object.message(args)" do
118
+ test "evaluate simple calls" do
119
+ assert { Predicate { Call("abc", :include?, "bc") }.evaluate }
120
+ deny { Predicate { Call("abc", :include?, "ZZ") }.evaluate }
121
+ end
122
+
123
+ test "nil call. call defaults to no args if none are specified" do
124
+ assert { Predicate { Call(nil, :nil?, []) }.evaluate }
125
+ deny { Predicate { Call("abc", :nil?, []) }.evaluate }
126
+
127
+ assert { Predicate { Call(nil, :nil?) }.evaluate }
128
+ deny { Predicate { Call("abc", :nil?) }.evaluate }
129
+ end
130
+
131
+ test "inspect" do
132
+ assert { Call.new("abc", :include?, "bc").inspect == "Call('abc'.include?('bc'))" }
133
+ end
134
+
135
+ test "inspect, empty right hand side" do
136
+ assert { Call.new("abc", :nil?).inspect == "Call('abc'.nil?)" }
137
+ end
138
+
139
+ test "call equality" do
140
+ assert { Call.new("abc", :include?, "bc") == Call.new("abc", :include?, "bc") }
141
+ deny { Call.new("ZZZ", :include?, "bc") == Call.new("abc", :include?, "bc") }
142
+ deny { Call.new("abc", :zzz, "bc") == Call.new("abc", :include?, "bc") }
143
+ deny { Call.new("abc", :include?, "ZZZ") == Call.new("abc", :include?, "bc") }
144
+ end
145
+
146
+
147
+ end
148
+
149
+ end
@@ -0,0 +1,43 @@
1
+ require "./test/test_helper_with_wrong"
2
+ require "./test/canonical_transform_cases"
3
+
4
+ if RUBY_VERSION =~/^1.9/
5
+ puts "skipping callable object-related tests in 1.9"
6
+ else
7
+
8
+ require "predicated/from/callable_object"
9
+ include Predicated
10
+
11
+ regarding "callable object - canoical transform cases" do
12
+ include CanonicalTransformCases
13
+
14
+ @expectations = {
15
+ "simple operations" => {
16
+ "eq" => Predicate.from_callable_object{"a"==3},
17
+ "gt" => Predicate.from_callable_object{"a">3},
18
+ "lt" => Predicate.from_callable_object{"a"<3},
19
+ "gte" => Predicate.from_callable_object{"a">=3},
20
+ "lte" => Predicate.from_callable_object{"a"<=3}
21
+ },
22
+ "primitive types" => {
23
+ "false" => Predicate.from_callable_object{"a"==false},
24
+ "true" => Predicate.from_callable_object{"a"==true},
25
+ "string" => Predicate.from_callable_object{"a"=="yyy"}
26
+ },
27
+ "not" => {
28
+ "simple" => Predicate.from_callable_object{!("a"==true)}
29
+ },
30
+ "simple and / or" => {
31
+ #parens are necessary around AND's in solr in order to force precedence
32
+ "and" => Predicate.from_callable_object{"a"==1 && "b"==2},
33
+ "or" => Predicate.from_callable_object{"a"==1 || "b"==2}
34
+ },
35
+ "complex and / or" => {
36
+ "or and" => Predicate.from_callable_object{"a"==1 && "b"==2 || "c"==3}
37
+ }
38
+ }
39
+
40
+ create_canonical_tests(@expectations)
41
+ end
42
+
43
+ end
@@ -0,0 +1,78 @@
1
+ require "./test/test_helper"
2
+ require "./test/canonical_transform_cases"
3
+
4
+
5
+ if RUBY_VERSION =~/^1.9/
6
+ puts "skipping callable object-related tests in 1.9"
7
+ else
8
+
9
+ require "predicated/from/callable_object"
10
+ include Predicated
11
+
12
+ regarding "convert a ruby callable object - a proc or lambda - into a predicate" do
13
+
14
+ regarding "basic operations" do
15
+
16
+ test "complex types" do
17
+ assert_equal Predicate.from_callable_object{Color.new("red")==Color.new("blue")},
18
+ Predicate{ Eq(Color.new("red"),Color.new("blue")) }
19
+
20
+ assert_equal Predicate.from_callable_object{ {1=>2}=={"a"=>"b"} },
21
+ Predicate{ Eq({1=>2},{"a"=>"b"}) }
22
+ end
23
+
24
+ test "word and / or" do
25
+ assert_equal Predicate.from_callable_object{1==1 and 2==2}, Predicate{ And(Eq(1,1),Eq(2,2)) }
26
+ assert_equal Predicate.from_callable_object{1==1 or 2==2}, Predicate{ Or(Eq(1,1),Eq(2,2)) }
27
+ end
28
+
29
+ test "substitute in from the binding" do
30
+ a = 1
31
+ b = "1"
32
+ c = "c"
33
+ d = Color.new("purple")
34
+
35
+ assert_equal Predicate.from_callable_object(binding()){a==1}, Predicate{ Eq(1,1) }
36
+ assert_equal Predicate.from_callable_object(binding()){b==1}, Predicate{ Eq("1",1) }
37
+ assert_equal Predicate.from_callable_object(binding()){c==b}, Predicate{ Eq("c","1") }
38
+ assert_equal Predicate.from_callable_object(binding()){d==d}, Predicate{ Eq(Color.new("purple"),
39
+ Color.new("purple")) }
40
+ assert Predicate.from_callable_object(binding()){d==d}.left === d
41
+
42
+ assert_equal Predicate.from_callable_object(binding()){a==b && b==c},
43
+ Predicate{ And(Eq(1,"1"),Eq("1","c")) }
44
+ end
45
+
46
+
47
+ test "parens change precedence" do
48
+ assert_equal Predicate.from_callable_object{1==1 || 2==2 && 3==3},
49
+ Predicate{ Or( Eq(1,1), And(Eq(2,2),Eq(3,3)) ) }
50
+
51
+ assert_equal Predicate.from_callable_object{(1==1 || 2==2) && 3==3},
52
+ Predicate{ And( Or(Eq(1,1),Eq(2,2)), Eq(3,3) ) }
53
+ end
54
+
55
+ test "works with procs and lambdas" do
56
+
57
+ assert_equal Predicate.from_callable_object(proc{1<2}), Predicate{ Lt(1,2) }
58
+ assert_equal Predicate.from_callable_object(lambda{1<2}), Predicate{ Lt(1,2) }
59
+
60
+ a = "aaa"
61
+ assert_equal Predicate.from_callable_object(proc{a=="bbb"}, binding()),
62
+ Predicate{ Eq("aaa","bbb") }
63
+ assert_equal Predicate.from_callable_object(lambda{a=="bbb"}, binding()),
64
+ Predicate{ Eq("aaa","bbb") }
65
+ end
66
+
67
+ end
68
+
69
+ regarding "errors" do
70
+ test "predicates only" do
71
+ assert_raises(Predicated::Predicate::DontKnowWhatToDoWithThisSexpError) do
72
+ Predicate.from_callable_object{a=1}
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,83 @@
1
+ require "./test/test_helper_with_wrong"
2
+
3
+ require "predicated/from/json"
4
+ require "./test/canonical_transform_cases"
5
+ include Predicated
6
+
7
+ regarding "convert a json string to a predicate" do
8
+ include CanonicalTransformCases
9
+
10
+ @expectations = {
11
+ "simple operations" => {
12
+ "eq" => Predicate.from_json_str(%{["a","==",3]}),
13
+ "gt" => Predicate.from_json_str(%{["a",">",3]}),
14
+ "lt" => Predicate.from_json_str(%{["a","<",3]}),
15
+ "gte" => Predicate.from_json_str(%{["a",">=",3]}),
16
+ "lte" => Predicate.from_json_str(%{["a","<=",3]})
17
+ },
18
+ "primitive types" => {
19
+ "false" => Predicate.from_json_str(%{["a","==",false]}),
20
+ "true" => Predicate.from_json_str(%{["a","==",true]}),
21
+ "string" => Predicate.from_json_str(%{["a","==","yyy"]})
22
+ },
23
+ "not" => {
24
+ "simple" => Predicate.from_json_str(%{{"not":["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_json_str(%{{"and":[["a","==",1],["b","==",2]]}}),
29
+ "or" => Predicate.from_json_str(%{{"or":[["a","==",1],["b","==",2]]}})
30
+ },
31
+ "complex and / or" => {
32
+ "or and" => Predicate.from_json_str(%{
33
+ {
34
+ "or":[
35
+ {"and":[["a","==",1],["b","==",2]]},
36
+ ["c","==",3]
37
+ ]
38
+ }
39
+ })
40
+ }
41
+ }
42
+
43
+ create_canonical_tests(@expectations)
44
+
45
+ end
46
+
47
+ regarding "convert a json structure to a predicate" do
48
+ include CanonicalTransformCases
49
+
50
+ @expectations = {
51
+ "simple operations" => {
52
+ "eq" => Predicate.from_json_struct(["a", "==", 3]),
53
+ "gt" => Predicate.from_json_struct(["a", ">", 3]),
54
+ "lt" => Predicate.from_json_struct(["a", "<", 3]),
55
+ "gte" => Predicate.from_json_struct(["a", ">=", 3]),
56
+ "lte" => Predicate.from_json_struct(["a", "<=", 3])
57
+ },
58
+ "primitive types" => {
59
+ "false" => Predicate.from_json_struct(["a", "==", false]),
60
+ "true" => Predicate.from_json_struct(["a", "==", true]),
61
+ "string" => Predicate.from_json_struct(["a", "==", "yyy"])
62
+ },
63
+ "not" => {
64
+ "simple" => Predicate.from_json_struct("not" => ["a", "==", true])
65
+ },
66
+ "simple and / or" => {
67
+ #parens are necessary around AND's in solr in order to force precedence
68
+ "and" => Predicate.from_json_struct("and" => [["a", "==", 1],["b", "==", 2]]),
69
+ "or" => Predicate.from_json_struct("or" => [["a", "==", 1],["b", "==", 2]])
70
+ },
71
+ "complex and / or" => {
72
+ "or and" => Predicate.from_json_struct(
73
+ "or" => [
74
+ {"and" => [["a", "==", 1],["b", "==", 2]]},
75
+ ["c", "==", 3]
76
+ ]
77
+ )
78
+ }
79
+ }
80
+
81
+ create_canonical_tests(@expectations)
82
+
83
+ end