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,4 +1,2 @@
1
- #simple way to make sure requires are isolated
2
- result = Dir["test/**/*_test.rb"].collect{|test_file| system("ruby #{test_file}") }.uniq == [true]
3
- puts "suite " + (result ? "passed" : "FAILED")
4
- exit(result ? 0 : 1)
1
+ require "./test/test_helper"
2
+ run_suite("test/**/*_test.rb")
@@ -8,6 +8,28 @@ require "pp"
8
8
  #DO NOT REQUIRE WRONG IN HERE
9
9
  #The circularity between projects will cause certain tests to not work.
10
10
 
11
+ class Color
12
+ attr_reader :name
13
+ def initialize(name)
14
+ @name = name
15
+ end
16
+
17
+ def ==(other)
18
+ other.is_a?(Color) && @name == other.name
19
+ end
20
+
21
+ def to_s
22
+ "name:#{@name}"
23
+ end
24
+ end
25
+
26
+ def run_suite(wildcard)
27
+ #simple way to make sure requires are isolated
28
+ result = Dir[wildcard].collect{|test_file| system("ruby #{test_file}") }.uniq == [true]
29
+ puts "suite " + (result ? "passed" : "FAILED")
30
+ exit(result ? 0 : 1)
31
+ end
32
+
11
33
  class MiniTest::Unit::TestCase
12
34
 
13
35
  def assert_raise(exception_info_regex)
@@ -21,10 +43,10 @@ class MiniTest::Unit::TestCase
21
43
  end
22
44
 
23
45
  module Kernel
24
- alias_method :apropos, :describe
46
+ alias_method :regarding, :describe
25
47
 
26
- def xapropos(str)
27
- puts "x'd out 'apropos \"#{str}\"'"
48
+ def xregarding(str)
49
+ puts "x'd out 'regarding \"#{str}\"'"
28
50
  end
29
51
  end
30
52
 
@@ -39,4 +61,4 @@ class MiniTest::Spec
39
61
  end
40
62
  end
41
63
 
42
- MiniTest::Unit.autorun
64
+ MiniTest::Unit.autorun
@@ -1,5 +1,6 @@
1
- require "test/test_helper"
1
+ require "./test/test_helper"
2
+
2
3
  require "wrong"
3
4
  require "wrong/adapters/minitest"
4
5
  require "wrong/message/test_context"
5
- require "wrong/message/string_diff"
6
+ require "wrong/message/string_diff"
@@ -1,43 +1,83 @@
1
- require "test/test_helper_with_wrong"
1
+ require "./test/test_helper_with_wrong"
2
+ require "./test/canonical_transform_cases"
2
3
 
3
4
  unless RUBY_VERSION=="1.8.6"
4
5
 
5
6
  require "predicated/to/arel"
6
7
  include Predicated
7
8
 
8
- apropos "convert a predicate to an arel where clause" do
9
-
10
- test "operations" do
11
- assert { Predicate{ Eq("a",1) }.to_arel == Arel::Predicates::Equality.new("a", 1) }
12
- assert { Predicate{ Gt("a",1) }.to_arel == Arel::Predicates::GreaterThan.new("a", 1) }
13
- assert { Predicate{ Lt("a",1) }.to_arel == Arel::Predicates::LessThan.new("a", 1) }
14
- assert { Predicate{ Gte("a",1) }.to_arel == Arel::Predicates::GreaterThanOrEqualTo.new("a", 1) }
15
- assert { Predicate{ Lte("a",1) }.to_arel == Arel::Predicates::LessThanOrEqualTo.new("a", 1) }
9
+ regarding "convert a predicate to an arel where clause" do
10
+ include CanonicalTransformCases
11
+
12
+ class FakeEngine
13
+ def connection
14
+ end
15
+
16
+ def table_exists?(name)
17
+ true
18
+ end
16
19
  end
17
-
18
- test "simple and + or" do
19
- assert { Predicate{ And(Eq("a", 1),Eq("b", 2)) }.to_arel ==
20
- Arel::Predicates::And.new(
21
- Arel::Predicates::Equality.new("a", 1),
22
- Arel::Predicates::Equality.new("b", 2)
23
- ) }
24
-
25
- assert { Predicate{ Or(Eq("a", 1),Eq("b", 2)) }.to_arel ==
26
- Arel::Predicates::Or.new(
27
- Arel::Predicates::Equality.new("a", 1),
28
- Arel::Predicates::Equality.new("b", 2)
29
- ) }
20
+
21
+ class FakeColumn
22
+ attr_reader :name, :type
23
+ def initialize(name, type)
24
+ @name = name
25
+ @type = type
26
+ end
27
+
28
+ def type_cast(value)
29
+ value
30
+ end
30
31
  end
31
32
 
32
- test "complex and + or" do
33
- assert { Predicate{ Or( And(Eq("a", 1),Eq("b", 2)), Eq("c", 3) ) }.to_arel ==
34
- Arel::Predicates::Or.new(
35
- Arel::Predicates::And.new(
36
- Arel::Predicates::Equality.new("a", 1),
37
- Arel::Predicates::Equality.new("b", 2)
38
- ),
39
- Arel::Predicates::Equality.new("c", 3)
40
- ) }
33
+ @table = Arel::Table.new(:widget, :engine => FakeEngine.new)
34
+ Arel::Table.tables = [@table]
35
+ @table.instance_variable_set("@columns".to_sym, [
36
+ FakeColumn.new("a", :integer),
37
+ FakeColumn.new("b", :integer),
38
+ FakeColumn.new("c", :integer)
39
+ ])
40
+
41
+
42
+ @to_expectations = {
43
+ "simple operations" => {
44
+ "eq" => Arel::Predicates::Equality.new(@table.attributes["a"], 3),
45
+ "gt" => Arel::Predicates::GreaterThan.new(@table.attributes["a"], 3),
46
+ "lt" => Arel::Predicates::LessThan.new(@table.attributes["a"], 3),
47
+ "gte" => Arel::Predicates::GreaterThanOrEqualTo.new(@table.attributes["a"], 3),
48
+ "lte" => Arel::Predicates::LessThanOrEqualTo.new(@table.attributes["a"], 3)
49
+ },
50
+ "primitive types" => {
51
+ "false" => Arel::Predicates::Equality.new(@table.attributes["a"], false),
52
+ "true" => Arel::Predicates::Equality.new(@table.attributes["a"], true),
53
+ "string" => Arel::Predicates::Equality.new(@table.attributes["a"], "yyy")
54
+ },
55
+ "not" => {
56
+ "simple" => Arel::Predicates::Not.new(Arel::Predicates::Equality.new(@table.attributes["a"], true))
57
+ },
58
+ "simple and / or" => {
59
+ "and" => Arel::Predicates::And.new(
60
+ Arel::Predicates::Equality.new(@table.attributes["a"], 1),
61
+ Arel::Predicates::Equality.new(@table.attributes["b"], 2)
62
+ ),
63
+ "or" => Arel::Predicates::Or.new(
64
+ Arel::Predicates::Equality.new(@table.attributes["a"], 1),
65
+ Arel::Predicates::Equality.new(@table.attributes["b"], 2)
66
+ )
67
+ },
68
+ "complex and / or" => {
69
+ "or and" => Arel::Predicates::Or.new(
70
+ Arel::Predicates::And.new(
71
+ Arel::Predicates::Equality.new(@table.attributes["a"], 1),
72
+ Arel::Predicates::Equality.new(@table.attributes["b"], 2)
73
+ ),
74
+ Arel::Predicates::Equality.new(@table.attributes["c"], 3)
75
+ )
76
+ }
77
+ }
78
+
79
+ create_canonical_tests(@to_expectations) do |predicate|
80
+ predicate.to_arel(@table)
41
81
  end
42
82
 
43
83
  end
@@ -0,0 +1,74 @@
1
+ require "./test/test_helper_with_wrong"
2
+ require "./test/canonical_transform_cases"
3
+
4
+ require "predicated/to/json"
5
+ include Predicated
6
+
7
+ regarding "convert a predicate to a json structure" do
8
+ include CanonicalTransformCases
9
+
10
+ @to_expectations = {
11
+ "simple operations" => {
12
+ "eq" => ["a", "==", 3],
13
+ "gt" => ["a", ">", 3],
14
+ "lt" => ["a", "<", 3],
15
+ "gte" => ["a", ">=", 3],
16
+ "lte" => ["a", "<=", 3]
17
+ },
18
+ "primitive types" => {
19
+ "false" => ["a", "==", false],
20
+ "true" => ["a", "==", true],
21
+ "string" => ["a", "==", "yyy"]
22
+ },
23
+ "not" => {
24
+ "simple" => {"not" => ["a", "==", true]}
25
+ },
26
+ "simple and / or" => {
27
+ "and" => {"and" => [["a", "==", 1], ["b", "==", 2]] },
28
+ "or" => {"or" => [["a", "==", 1], ["b", "==", 2]] }
29
+ },
30
+ "complex and / or" => {
31
+ "or and" => {"or" => [
32
+ {"and" => [["a", "==", 1], ["b", "==", 2]]},
33
+ ["c", "==", 3]
34
+ ]}
35
+ }
36
+ }
37
+
38
+ create_canonical_tests(@to_expectations) do |predicate|
39
+ predicate.to_json_struct
40
+ end
41
+ end
42
+
43
+ regarding "convert a predicate to a json string" do
44
+ include CanonicalTransformCases
45
+
46
+ @to_expectations = {
47
+ "simple operations" => {
48
+ "eq" => %{["a","==",3]},
49
+ "gt" => %{["a",">",3]},
50
+ "lt" => %{["a","<",3]},
51
+ "gte" => %{["a",">=",3]},
52
+ "lte" => %{["a","<=",3]}
53
+ },
54
+ "primitive types" => {
55
+ "false" => %{["a","==",false]},
56
+ "true" => %{["a","==",true]},
57
+ "string" => %{["a","==","yyy"]}
58
+ },
59
+ "not" => {
60
+ "simple" => %{{"not":["a","==",true]}}
61
+ },
62
+ "simple and / or" => {
63
+ "and" => %{{"and":[["a","==",1],["b","==",2]]}},
64
+ "or" => %{{"or":[["a","==",1],["b","==",2]]}}
65
+ },
66
+ "complex and / or" => {
67
+ "or and" => %{{"or":[{"and":[["a","==",1],["b","==",2]]},["c","==",3]]}}
68
+ }
69
+ }
70
+
71
+ create_canonical_tests(@to_expectations) do |predicate|
72
+ predicate.to_json_str.gsub("\n", "").gsub(" ", "")
73
+ end
74
+ end
@@ -1,83 +1,90 @@
1
- require "test/test_helper_with_wrong"
1
+ require "./test/test_helper_with_wrong"
2
2
 
3
3
  require "predicated/to/sentence"
4
4
  include Predicated
5
5
 
6
- apropos "convert a predicate to an english sentence" do
6
+ regarding "convert a predicate to an english sentence" do
7
7
 
8
8
  after do
9
9
  Operation.reset_verb_phrases
10
10
  end
11
11
 
12
12
  test "operations" do
13
- assert { Predicate{ Eq("a",1) }.to_sentence == "'a' is equal to 1" }
14
- assert { Predicate{ Gt("a",1) }.to_sentence == "'a' is greater than 1" }
15
- assert { Predicate{ Lt("a",1) }.to_sentence == "'a' is less than 1" }
16
- assert { Predicate{ Gte("a",1) }.to_sentence == "'a' is greater than or equal to 1" }
17
- assert { Predicate{ Lte("a",1) }.to_sentence == "'a' is less than or equal to 1" }
13
+ assert { Predicate{ Eq("a",1) }.to_sentence == '"a" is equal to 1' }
14
+ assert { Predicate{ Gt("a",1) }.to_sentence == '"a" is greater than 1' }
15
+ assert { Predicate{ Lt("a",1) }.to_sentence == '"a" is less than 1' }
16
+ assert { Predicate{ Gte("a",1) }.to_sentence == '"a" is greater than or equal to 1' }
17
+ assert { Predicate{ Lte("a",1) }.to_sentence == '"a" is less than or equal to 1' }
18
18
 
19
- assert { Predicate{ Eq("a",1) }.to_negative_sentence == "'a' is not equal to 1" }
20
- assert { Predicate{ Gt("a",1) }.to_negative_sentence == "'a' is not greater than 1" }
21
- assert { Predicate{ Lt("a",1) }.to_negative_sentence == "'a' is not less than 1" }
22
- assert { Predicate{ Gte("a",1) }.to_negative_sentence == "'a' is not greater than or equal to 1" }
23
- assert { Predicate{ Lte("a",1) } .to_negative_sentence == "'a' is not less than or equal to 1" }
19
+ assert { Predicate{ Eq("a",1) }.to_negative_sentence == '"a" is not equal to 1' }
20
+ assert { Predicate{ Gt("a",1) }.to_negative_sentence == '"a" is not greater than 1' }
21
+ assert { Predicate{ Lt("a",1) }.to_negative_sentence == '"a" is not less than 1' }
22
+ assert { Predicate{ Gte("a",1) }.to_negative_sentence == '"a" is not greater than or equal to 1' }
23
+ assert { Predicate{ Lte("a",1) } .to_negative_sentence == '"a" is not less than or equal to 1' }
24
24
  end
25
25
 
26
26
  test "primitive types" do
27
- assert { Predicate{ Eq("a",1) }.to_sentence == "'a' is equal to 1" }
28
- assert { Predicate{ Eq("a",nil) }.to_sentence == "'a' is equal to nil" }
29
- assert { Predicate{ Eq("a",true) }.to_sentence == "'a' is equal to true" }
27
+ assert { Predicate{ Eq("a",1) }.to_sentence == '"a" is equal to 1' }
28
+ assert { Predicate{ Eq("a",nil) }.to_sentence == '"a" is equal to nil' }
29
+ assert { Predicate{ Eq("a",true) }.to_sentence == '"a" is equal to true' }
30
+ assert { Predicate{ Eq("a",3.14) }.to_sentence == '"a" is equal to 3.14' }
31
+ end
32
+
33
+ test "not" do
34
+ assert { Predicate{ Not(Eq("a",1)) }.to_sentence == '"a" is not equal to 1' }
35
+ assert { Predicate{ Not(Eq("a",1)) }.to_negative_sentence == '"a" is equal to 1' }
30
36
  end
31
37
 
32
38
  test "complex types" do
33
- assert { Predicate{ Eq([1,2],{3=>4}) }.to_sentence == "'[1, 2]' is equal to '{3=>4}'" }
39
+ assert { Predicate{ Eq([1,2],{3=>4}) }.to_sentence == "[1, 2] is equal to {3=>4}" }
34
40
  end
35
41
 
36
42
  test "default verb phrases for unknown methods (which are awkward/ESL-ish)" do
37
43
  assert { Predicate{ Call("abc", :exclude?, "bc") }.to_sentence ==
38
- "'abc' is exclude 'bc'" }
44
+ '"abc" is exclude "bc"' }
39
45
 
40
46
  assert { Predicate{ Call("abc", :exclude?, "bc") }.to_negative_sentence ==
41
- "'abc' is not exclude 'bc'" }
47
+ '"abc" is not exclude "bc"' }
42
48
 
43
49
  assert { Predicate{ Call("abc", :friends_with?, "bc") }.to_sentence ==
44
- "'abc' is friends with 'bc'" }
50
+ '"abc" is friends with "bc"' }
45
51
  end
46
52
 
47
53
  test "register methods and their verb phrases" do
48
- Operation.register_verb_phrase(:exclude?, "does exclude", "does not exclude")
54
+ Operation.register_verb_phrase(:exclude?, "excludes", "does not exclude")
49
55
  assert { Predicate{ Call("abc", :exclude?, "bc") }.to_sentence ==
50
- "'abc' does exclude 'bc'" }
56
+ '"abc" excludes "bc"' }
51
57
 
52
58
  assert { Predicate{ Call("abc", :exclude?, "bc") }.to_negative_sentence ==
53
- "'abc' does not exclude 'bc'" }
59
+ '"abc" does not exclude "bc"' }
54
60
  end
55
61
 
56
62
  test "some other common methods have sensible verb phrases by default" do
57
- assert { Predicate{ Call("abc", :include?, 'bc') }.to_sentence == "'abc' includes 'bc'" }
58
- assert { Predicate{ Call("abc", :include?, 'bc') }.to_negative_sentence == "'abc' does not include 'bc'" }
59
-
60
- assert { Predicate{ Call("abc", :is_a?, String) }.to_sentence == "'abc' is a 'String'" }
61
- assert { Predicate{ Call("abc", :is_a?, String) }.to_negative_sentence == "'abc' is not a 'String'" }
63
+ assert { Predicate{ Call("abc", :include?, 'bc') }.to_sentence == '"abc" includes "bc"' }
64
+ assert { Predicate{ Call("abc", :include?, 'bc') }.to_negative_sentence == '"abc" does not include "bc"' }
65
+
66
+ s = Predicate{ Call("abc", :is_a?, String) }.to_sentence
67
+ assert { s == '"abc" is a String' }
68
+ assert { Predicate{ Call("abc", :is_a?, String) }.to_negative_sentence == '"abc" is not a String' }
62
69
  end
63
70
 
64
71
  test "nothing on the far side" do
65
- assert { Predicate{ Call("abc", :nil?) }.to_sentence == "'abc' is nil" }
66
- assert { Predicate{ Call("abc", :nil?) }.to_negative_sentence == "'abc' is not nil" }
72
+ assert { Predicate{ Call("abc", :nil?) }.to_sentence == '"abc" is nil' }
73
+ assert { Predicate{ Call("abc", :nil?) }.to_negative_sentence == '"abc" is not nil' }
67
74
  end
68
75
 
69
76
  test "simple and + or" do
70
77
  assert { Predicate{ And(Eq("a", 1),Eq("b", 2)) }.to_sentence ==
71
- "'a' is equal to 1 and 'b' is equal to 2" }
78
+ '"a" is equal to 1 and "b" is equal to 2' }
72
79
 
73
80
  assert { Predicate{ Or(Eq("a", 1),Eq("b", 2)) }.to_sentence ==
74
- "'a' is equal to 1 or 'b' is equal to 2" }
81
+ '"a" is equal to 1 or "b" is equal to 2' }
75
82
 
76
83
  assert { Predicate{ And(Eq("a", 1),Eq("b", 2)) }.to_negative_sentence ==
77
- "This is not true: 'a' is equal to 1 and 'b' is equal to 2" }
84
+ 'This is not true: "a" is equal to 1 and "b" is equal to 2' }
78
85
 
79
86
  assert { Predicate{ Or(Eq("a", 1),Eq("b", 2)) }.to_negative_sentence ==
80
- "This is not true: 'a' is equal to 1 or 'b' is equal to 2" }
87
+ 'This is not true: "a" is equal to 1 or "b" is equal to 2' }
81
88
  end
82
89
 
83
- end
90
+ end
@@ -0,0 +1,39 @@
1
+ require "./test/test_helper_with_wrong"
2
+ require "./test/canonical_transform_cases"
3
+
4
+ require "predicated/to/solr"
5
+ include Predicated
6
+
7
+ regarding "convert a predicate to a solr query" do
8
+ include CanonicalTransformCases
9
+
10
+ @to_expectations = {
11
+ "simple operations" => {
12
+ "eq" => "a:3",
13
+ "gt" => "a:[4 TO *]",
14
+ "lt" => "a:[* TO 2]",
15
+ "gte" => "a:[3 TO *]",
16
+ "lte" => "a:[* TO 3]"
17
+ },
18
+ "primitive types" => {
19
+ "false" => "a:false",
20
+ "true" => "a:true",
21
+ "string" => "a:yyy"
22
+ },
23
+ "not" => {
24
+ "simple" => "NOT(a:true)"
25
+ },
26
+ "simple and / or" => {
27
+ "and" => "(a:1 AND b:2)", #parens are necessary around AND's in solr in order to force precedence
28
+ "or" => "(a:1 OR b:2)",
29
+ },
30
+ "complex and / or" => {
31
+ "or and" => "((a:1 AND b:2) OR c:3)"
32
+ }
33
+ }
34
+
35
+ create_canonical_tests(@to_expectations) do |predicate|
36
+ predicate.to_solr
37
+ end
38
+
39
+ end
@@ -0,0 +1,72 @@
1
+ require "./test/test_helper_with_wrong"
2
+ require "./test/canonical_transform_cases"
3
+
4
+ require "predicated/to/xml"
5
+ include Predicated
6
+
7
+ regarding "convert a predicate to an xml string" do
8
+ include CanonicalTransformCases
9
+
10
+ @to_expectations = {
11
+ "simple operations" => {
12
+ "eq" => "<equal><left>a</left><right>3</right></equal>",
13
+ "gt" => "<greaterThan><left>a</left><right>3</right></greaterThan>",
14
+ "lt" => "<lessThan><left>a</left><right>3</right></lessThan>",
15
+ "gte" => "<greaterThanOrEqualTo><left>a</left><right>3</right></greaterThanOrEqualTo>",
16
+ "lte" => "<lessThanOrEqualTo><left>a</left><right>3</right></lessThanOrEqualTo>"
17
+ },
18
+ "primitive types" => {
19
+ "false" => "<equal><left>a</left><right>false</right></equal>",
20
+ "true" => "<equal><left>a</left><right>true</right></equal>",
21
+ "string" => "<equal><left>a</left><right>yyy</right></equal>"
22
+ },
23
+ "not" => {
24
+ "simple" => "<not><equal><left>a</left><right>true</right></equal></not>"
25
+ },
26
+ "simple and / or" => {
27
+ "and" => %{<and>
28
+ <equal><left>a</left><right>1</right></equal>
29
+ <equal><left>b</left><right>2</right></equal>
30
+ </and>}.gsub("\n", "").gsub(" ", ""),
31
+ "or" => %{<or>
32
+ <equal><left>a</left><right>1</right></equal>
33
+ <equal><left>b</left><right>2</right></equal>
34
+ </or>}.gsub("\n", "").gsub(" ", "")
35
+ },
36
+ "complex and / or" => {
37
+ "or and" => %{<or>
38
+ <and>
39
+ <equal><left>a</left><right>1</right></equal>
40
+ <equal><left>b</left><right>2</right></equal>
41
+ </and>
42
+ <equal><left>c</left><right>3</right></equal>
43
+ </or>}.gsub("\n", "").gsub(" ", "")
44
+ }
45
+ }
46
+
47
+ create_canonical_tests(@to_expectations) do |predicate|
48
+ predicate.to_xml.gsub("\n", "").gsub(" ", "")
49
+ end
50
+
51
+ test "pretty printing" do
52
+ assert{
53
+ Predicate{ Or(And(Eq("a", 1),Eq("b", 2)), Not(Eq("c",3))) }.to_xml ==
54
+ %{<or>
55
+ <and>
56
+ <equal><left>a</left><right>1</right></equal>
57
+ <equal><left>b</left><right>2</right></equal>
58
+ </and>
59
+ <not>
60
+ <equal><left>c</left><right>3</right></equal>
61
+ </not>
62
+ </or>}
63
+ }
64
+ end
65
+
66
+ test "characters that need to be encoded" do
67
+ assert{
68
+ Predicate{ Eq(%{'"&<>}, %{'"&<>}) }.to_xml ==
69
+ %{<equal><left>&apos;&quot;&amp;&lt;&gt;</left><right>&apos;&quot;&amp;&lt;&gt;</right></equal>}
70
+ }
71
+ end
72
+ end