1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
require 'helper'
module Arel
module Visitors
class TestDepthFirst < MiniTest::Unit::TestCase
Collector = Struct.new(:calls) do
def call object
calls << object
end
end
def setup
@collector = Collector.new []
@visitor = Visitors::DepthFirst.new @collector
end
[
Arel::Nodes::And,
Arel::Nodes::Assignment,
Arel::Nodes::Between,
Arel::Nodes::DoesNotMatch,
Arel::Nodes::Equality,
Arel::Nodes::GreaterThan,
Arel::Nodes::GreaterThanOrEqual,
Arel::Nodes::In,
Arel::Nodes::LessThan,
Arel::Nodes::LessThanOrEqual,
Arel::Nodes::Matches,
Arel::Nodes::NotEqual,
Arel::Nodes::NotIn,
Arel::Nodes::Or,
].each do |klass|
define_method("test_#{klass.name.gsub('::', '_')}") do
binary = klass.new(:a, :b)
@visitor.accept binary
assert_equal [:a, :b, binary], @collector.calls
end
end
[
Arel::Attributes::Integer,
Arel::Attributes::Float,
Arel::Attributes::String,
Arel::Attributes::Time,
Arel::Attributes::Boolean,
Arel::Attributes::Attribute
].each do |klass|
define_method("test_#{klass.name.gsub('::', '_')}") do
binary = klass.new(:a, :b)
@visitor.accept binary
assert_equal [:a, :b, binary], @collector.calls
end
end
def test_table
relation = Arel::Table.new(:users)
@visitor.accept relation
assert_equal ['users', relation], @collector.calls
end
def test_array
node = Nodes::Or.new(:a, :b)
list = [node]
@visitor.accept list
assert_equal [:a, :b, node, list], @collector.calls
end
def test_hash
node = Nodes::Or.new(:a, :b)
hash = { node => node }
@visitor.accept hash
assert_equal [:a, :b, node, :a, :b, node, hash], @collector.calls
end
def test_update_statement
stmt = Nodes::UpdateStatement.new
stmt.relation = :a
stmt.values << :b
stmt.wheres << :c
stmt.orders << :d
stmt.limit = :e
@visitor.accept stmt
assert_equal [:a, :b, stmt.values, :c, stmt.wheres, :d, stmt.orders,
:e, stmt], @collector.calls
end
def test_select_core
core = Nodes::SelectCore.new
core.projections << :a
core.froms = :b
core.wheres << :c
core.groups << :d
core.having = :e
@visitor.accept core
assert_equal [
:a, core.projections,
:b,
:c, core.wheres,
:d, core.groups,
:e,
core], @collector.calls
end
end
end
end
|