33require "interscript/isc"
44
55RSpec . describe Interscript ::Isc ::Transform do
6+ let ( :parser ) { Interscript ::Isc ::Parser . new }
7+
8+ def parse_item ( src )
9+ tree = parser . parse ( src , filename : "t.isc" )
10+ doc = Interscript ::Isc ::DocumentBuilder . build ( tree , filename : "t.isc" )
11+ stage = doc [ :stages ] . first
12+ rule = stage [ :body ] . first [ :rule ] || stage [ :body ] . first [ :rules ] &.first
13+ rule
14+ end
15+
616 it "transforms a quoted string to StringValue" do
7- tree = { string : { simple : "hello" } }
8- result = described_class . new . apply ( tree )
9- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::StringValue )
10- expect ( result . value ) . to eq ( "hello" )
17+ rule = parse_item ( <<~ISC )
18+ system "X:eng-Latn:Latn:1" {
19+ metadata { name "T" }
20+ stage main { sub "hello" "world" }
21+ }
22+ ISC
23+ expect ( rule [ :from ] ) . to be_a ( Interscript ::Isc ::Items ::StringValue )
24+ expect ( rule [ :from ] . value ) . to eq ( "hello" )
25+ expect ( rule [ :to ] . value ) . to eq ( "world" )
1126 end
1227
13- it "transforms escape sequences" do
14- tree = { string : { sequence : [ { char : "a" } , { newline : "n" } , { char : "b" } ] } }
15- result = described_class . new . apply ( tree )
16- expect ( result . value ) . to eq ( "a\n b" )
28+ it "transforms escape sequences in strings" do
29+ rule = parse_item ( <<~ISC )
30+ system "X:eng-Latn:Latn:1" {
31+ metadata { name "T" }
32+ stage main { sub "a\\ nb" "c" }
33+ }
34+ ISC
35+ expect ( rule [ :from ] . value ) . to eq ( "a\n b" )
1736 end
1837
1938 it "transforms unicode escapes" do
20- tree = { string : { sequence : [ { unicode : "00e9" } ] } }
21- result = described_class . new . apply ( tree )
22- expect ( result . value ) . to eq ( "é" )
39+ rule = parse_item ( <<~ISC )
40+ system "X:eng-Latn:Latn:1" {
41+ metadata { name "T" }
42+ stage main { sub "\\ u00e9" "e" }
43+ }
44+ ISC
45+ expect ( rule [ :from ] . value ) . to eq ( "é" )
2346 end
2447
2548 it "transforms none to Items::None" do
26- tree = { none : { simple : nil } }
27- result = described_class . new . apply ( tree )
28- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::None )
49+ rule = parse_item ( <<~ISC )
50+ system "X:eng-Latn:Latn:1" {
51+ metadata { name "T" }
52+ stage main { sub none "X" }
53+ }
54+ ISC
55+ expect ( rule [ :from ] ) . to be_a ( Interscript ::Isc ::Items ::None )
2956 end
3057
3158 it "transforms zero-width primitives" do
3259 %w[ boundary line_start line_end word_boundary space non_boundary ] . each do |prim |
33- tree = { primitive : { simple : prim } }
34- result = described_class . new . apply ( tree )
35- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::Primitive )
36- expect ( result . name ) . to eq ( prim )
60+ rule = parse_item ( <<~ISC )
61+ system "X:eng-Latn:Latn:1" {
62+ metadata { name "T" }
63+ stage main { sub #{ prim } "X" }
64+ }
65+ ISC
66+ expect ( rule [ :from ] ) . to be_a ( Interscript ::Isc ::Items ::Primitive ) ,
67+ "expected Primitive for #{ prim } , got #{ rule [ :from ] . class } "
68+ expect ( rule [ :from ] . name ) . to eq ( prim )
3769 end
3870 end
3971
4072 it "transforms alias references" do
41- tree = { alias : { simple : "my_alias" } }
42- result = described_class . new . apply ( tree )
43- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::AliasRef )
44- expect ( result . name ) . to eq ( "my_alias" )
73+ rule = parse_item ( <<~ISC )
74+ system "X:eng-Latn:Latn:1" {
75+ metadata { name "T" }
76+ aliases {
77+ my_alias = "abc"
78+ }
79+ stage main { sub my_alias "X" }
80+ }
81+ ISC
82+ expect ( rule [ :from ] ) . to be_a ( Interscript ::Isc ::Items ::AliasRef )
83+ expect ( rule [ :from ] . name ) . to eq ( "my_alias" )
4584 end
4685
4786 it "transforms capture references" do
48- tree = { ref : { digit : { simple : "3" } } }
49- result = described_class . new . apply ( tree )
50- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::Capture )
51- expect ( result . index ) . to eq ( 3 )
87+ rule = parse_item ( <<~ISC )
88+ system "X:eng-Latn:Latn:1" {
89+ metadata { name "T" }
90+ stage main { sub capture("a") ref(1) }
91+ }
92+ ISC
93+ expect ( rule [ :to ] ) . to be_a ( Interscript ::Isc ::Items ::Capture )
94+ expect ( rule [ :to ] . index ) . to eq ( 1 )
5295 end
5396
5497 it "transforms capture groups" do
55- tree = { capture_inner : { string : { simple : "x" } } }
56- result = described_class . new . apply ( tree )
57- expect ( result ) . to be_a ( Interscript ::Isc ::Items ::CaptureGroup )
98+ rule = parse_item ( <<~ISC )
99+ system "X:eng-Latn:Latn:1" {
100+ metadata { name "T" }
101+ stage main { sub capture("x") "y" }
102+ }
103+ ISC
104+ expect ( rule [ :from ] ) . to be_a ( Interscript ::Isc ::Items ::CaptureGroup )
58105 end
59106end
60107
93140 expect ( item . index ) . to eq ( 2 )
94141 end
95142 end
96- end
143+ end
0 commit comments