-
Notifications
You must be signed in to change notification settings - Fork 95
/
transform_spec.rb
79 lines (68 loc) · 2.19 KB
/
transform_spec.rb
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
require 'spec_helper'
require 'parslet'
describe Parslet::Transform do
include Parslet
let(:transform) { Parslet::Transform.new }
attr_reader :transform
before(:each) do
@transform = Parslet::Transform.new
end
class A < Struct.new(:elt); end
class B < Struct.new(:elt); end
class C < Struct.new(:elt); end
class Bi < Struct.new(:a, :b); end
describe "delayed construction" do
context "given simple(:x) => A.new(x)" do
before(:each) do
transform.rule(simple(:x)) { |d| A.new(d[:x]) }
end
it "should transform 'a' into A.new('a')" do
transform.apply('a').should == A.new('a')
end
it "should transform ['a', 'b'] into [A.new('a'), A.new('b')]" do
transform.apply(['a', 'b']).should ==
[A.new('a'), A.new('b')]
end
end
context "given rules on {:a => simple(:x)} and {:b => :_x}" do
before(:each) do
transform.rule(:a => simple(:x)) { |d| A.new(d[:x]) }
transform.rule(:b => simple(:x)) { |d| B.new(d[:x]) }
end
it "should transform {:d=>{:b=>'c'}} into d => B('c')" do
transform.apply({:d=>{:b=>'c'}}).should == {:d => B.new('c')}
end
it "should transform {:a=>{:b=>'c'}} into A(B('c'))" do
transform.apply({:a=>{:b=>'c'}}).should == A.new(B.new('c'))
end
end
describe "pulling out subbranches" do
before(:each) do
transform.rule(:a => {:b => simple(:x)}, :d => {:e => simple(:y)}) { |d|
Bi.new(*d.values_at(:x, :y))
}
end
it "should yield Bi.new('c', 'f')" do
transform.apply(:a => {:b => 'c'}, :d => {:e => 'f'}).should ==
Bi.new('c', 'f')
end
end
end
describe "dsl construction" do
let(:transform) { Parslet::Transform.new do
rule(simple(:x)) { A.new(x) }
end
}
it "should still evaluate rules correctly" do
transform.apply('a').should == A.new('a')
end
end
context "when not using the bindings as hash, but as local variables" do
before(:each) do
transform.rule(simple(:x)) { A.new(x) }
end
it "should access the variables" do
transform.apply('a').should == A.new('a')
end
end
end