gisele-language 0.5.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.
- data/CHANGELOG.md +5 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +26 -0
- data/LICENCE.md +22 -0
- data/Manifest.txt +13 -0
- data/README.md +7 -0
- data/Rakefile +11 -0
- data/gisele-language.gemspec +188 -0
- data/gisele-language.noespec +24 -0
- data/lib/gisele/language/ast/bool_and.rb +14 -0
- data/lib/gisele/language/ast/bool_expr.rb +22 -0
- data/lib/gisele/language/ast/bool_not.rb +14 -0
- data/lib/gisele/language/ast/bool_or.rb +14 -0
- data/lib/gisele/language/ast/case_st.rb +14 -0
- data/lib/gisele/language/ast/else_clause.rb +14 -0
- data/lib/gisele/language/ast/elsif_clause.rb +14 -0
- data/lib/gisele/language/ast/if_st.rb +14 -0
- data/lib/gisele/language/ast/node.rb +35 -0
- data/lib/gisele/language/ast/task_call_st.rb +14 -0
- data/lib/gisele/language/ast/var_ref.rb +14 -0
- data/lib/gisele/language/ast/when_clause.rb +14 -0
- data/lib/gisele/language/ast/while_st.rb +14 -0
- data/lib/gisele/language/grammar.citrus +236 -0
- data/lib/gisele/language/grammar.sexp.yml +83 -0
- data/lib/gisele/language/processors/elsif_flattener.rb +36 -0
- data/lib/gisele/language/processors/if_to_case.rb +65 -0
- data/lib/gisele/language/processors/scoping_helper.rb +32 -0
- data/lib/gisele/language/processors/sugar_removal.rb +17 -0
- data/lib/gisele/language/processors.rb +4 -0
- data/lib/gisele/language/syntax/bool_and.rb +14 -0
- data/lib/gisele/language/syntax/bool_expr.rb +14 -0
- data/lib/gisele/language/syntax/bool_lit.rb +14 -0
- data/lib/gisele/language/syntax/bool_not.rb +14 -0
- data/lib/gisele/language/syntax/bool_or.rb +14 -0
- data/lib/gisele/language/syntax/bool_paren.rb +14 -0
- data/lib/gisele/language/syntax/case_st.rb +19 -0
- data/lib/gisele/language/syntax/else_clause.rb +14 -0
- data/lib/gisele/language/syntax/elsif_clause.rb +16 -0
- data/lib/gisele/language/syntax/event_set.rb +15 -0
- data/lib/gisele/language/syntax/fluent_def.rb +18 -0
- data/lib/gisele/language/syntax/if_st.rb +18 -0
- data/lib/gisele/language/syntax/implicit_seq_st.rb +16 -0
- data/lib/gisele/language/syntax/node.rb +40 -0
- data/lib/gisele/language/syntax/par_st.rb +14 -0
- data/lib/gisele/language/syntax/seq_st.rb +14 -0
- data/lib/gisele/language/syntax/st_list.rb +14 -0
- data/lib/gisele/language/syntax/task_call_st.rb +14 -0
- data/lib/gisele/language/syntax/task_def.rb +18 -0
- data/lib/gisele/language/syntax/trackvar_def.rb +19 -0
- data/lib/gisele/language/syntax/unit_def.rb +14 -0
- data/lib/gisele/language/syntax/var_ref.rb +14 -0
- data/lib/gisele/language/syntax/when_clause.rb +16 -0
- data/lib/gisele/language/syntax/while_st.rb +16 -0
- data/lib/gisele/language.rb +31 -0
- data/lib/gisele-language/loader.rb +3 -0
- data/lib/gisele-language/version.rb +16 -0
- data/lib/gisele-language.rb +19 -0
- data/spec/fixtures/tasks/complete.gis +40 -0
- data/spec/fixtures/tasks/simple.ast +51 -0
- data/spec/fixtures/tasks/simple.gis +16 -0
- data/spec/language/ast/test_bool_expr.rb +50 -0
- data/spec/language/grammar_sexp/test_case_st.rb +20 -0
- data/spec/language/grammar_sexp/test_event_set.rb +14 -0
- data/spec/language/grammar_sexp/test_fluent_def.rb +18 -0
- data/spec/language/grammar_sexp/test_initially.rb +18 -0
- data/spec/language/grammar_sexp/test_nop_st.rb +10 -0
- data/spec/language/grammar_sexp/test_when_clause.rb +12 -0
- data/spec/language/processors/test_elsif_flattener.rb +94 -0
- data/spec/language/processors/test_if_to_case.rb +105 -0
- data/spec/language/processors/test_scoping_helper.rb +45 -0
- data/spec/language/syntax/grammar/test_bool_expr.rb +34 -0
- data/spec/language/syntax/grammar/test_boolean_literal.rb +17 -0
- data/spec/language/syntax/grammar/test_case_st.rb +60 -0
- data/spec/language/syntax/grammar/test_event.rb +18 -0
- data/spec/language/syntax/grammar/test_event_name.rb +21 -0
- data/spec/language/syntax/grammar/test_event_set.rb +26 -0
- data/spec/language/syntax/grammar/test_fluent_def.rb +21 -0
- data/spec/language/syntax/grammar/test_if_st.rb +21 -0
- data/spec/language/syntax/grammar/test_par_st.rb +11 -0
- data/spec/language/syntax/grammar/test_process_statement.rb +19 -0
- data/spec/language/syntax/grammar/test_seq_st.rb +11 -0
- data/spec/language/syntax/grammar/test_spaces.rb +19 -0
- data/spec/language/syntax/grammar/test_spacing.rb +17 -0
- data/spec/language/syntax/grammar/test_task_def.rb +35 -0
- data/spec/language/syntax/grammar/test_task_name.rb +19 -0
- data/spec/language/syntax/grammar/test_task_start_or_end.rb +17 -0
- data/spec/language/syntax/grammar/test_trackvar_def.rb +21 -0
- data/spec/language/syntax/grammar/test_unit_def.rb +29 -0
- data/spec/language/syntax/grammar/test_variable_name.rb +51 -0
- data/spec/language/syntax/grammar/test_when_clause.rb +21 -0
- data/spec/language/syntax/grammar/test_while_st.rb +11 -0
- data/spec/language/syntax/to_ast/test_bool_expr.rb +32 -0
- data/spec/language/syntax/to_ast/test_case_st.rb +47 -0
- data/spec/language/syntax/to_ast/test_else_clause.rb +13 -0
- data/spec/language/syntax/to_ast/test_elsif_clause.rb +15 -0
- data/spec/language/syntax/to_ast/test_event_set.rb +24 -0
- data/spec/language/syntax/to_ast/test_fluent_def.rb +26 -0
- data/spec/language/syntax/to_ast/test_if_st.rb +39 -0
- data/spec/language/syntax/to_ast/test_par_st.rb +12 -0
- data/spec/language/syntax/to_ast/test_seq_st.rb +12 -0
- data/spec/language/syntax/to_ast/test_task_call_st.rb +10 -0
- data/spec/language/syntax/to_ast/test_task_def.rb +44 -0
- data/spec/language/syntax/to_ast/test_trackvar_def.rb +26 -0
- data/spec/language/syntax/to_ast/test_unit_def.rb +28 -0
- data/spec/language/syntax/to_ast/test_var_ref.rb +12 -0
- data/spec/language/syntax/to_ast/test_when_clause.rb +15 -0
- data/spec/language/syntax/to_ast/test_while_st.rb +24 -0
- data/spec/language/test_syntax.rb +51 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/test_gisele-language.rb +8 -0
- data/tasks/gem.rake +73 -0
- data/tasks/spec_test.rake +71 -0
- metadata +269 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe BoolExpr, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'is correctly extended by Sexpr' do
|
|
6
|
+
ast("true", :bool_expr).should be_a(Gisele::Language::AST::BoolExpr)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it 'returns expected ast on simple expressions' do
|
|
10
|
+
expected = \
|
|
11
|
+
[:bool_expr, [:bool_and, [:var_ref, "diagKnown"], [:var_ref, "platLow"]]]
|
|
12
|
+
ast("diagKnown and platLow", :bool_expr).should eq(expected)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'respects priorities' do
|
|
16
|
+
expected = [:bool_expr,
|
|
17
|
+
[:bool_or, [:bool_and, [:var_ref, "diagKnown"], [:var_ref, "platLow"]], [:var_ref, "platHigh"]]]
|
|
18
|
+
ast("diagKnown and platLow or platHigh", :bool_expr).should eq(expected)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'supports double negations' do
|
|
22
|
+
expected = [:bool_expr, [:bool_not, [:bool_not, [:var_ref, "diagKnown"]]]]
|
|
23
|
+
ast("not not(diagKnown)", :bool_expr).should eq(expected)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'makes boolean literals explicit' do
|
|
27
|
+
ast("true", :bool_expr).should eq([:bool_expr, [:bool_lit, true]])
|
|
28
|
+
ast("false", :bool_expr).should eq([:bool_expr, [:bool_lit, false]])
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe CaseSt, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'arranges when clauses as expected' do
|
|
6
|
+
expr = <<-CASE_ST.strip
|
|
7
|
+
case
|
|
8
|
+
when good
|
|
9
|
+
Task1
|
|
10
|
+
when bad
|
|
11
|
+
Task2
|
|
12
|
+
end
|
|
13
|
+
CASE_ST
|
|
14
|
+
when_clause1 = ast("when good Task1", :when_clause)
|
|
15
|
+
when_clause2 = ast("when bad Task2", :when_clause)
|
|
16
|
+
expected = [:case_st, nil, when_clause1, when_clause2]
|
|
17
|
+
ast(expr, :case_st).should eq(expected)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'puts the else clause at the end' do
|
|
21
|
+
expr = <<-CASE_ST.strip
|
|
22
|
+
case
|
|
23
|
+
when good
|
|
24
|
+
Task1
|
|
25
|
+
else
|
|
26
|
+
Task2
|
|
27
|
+
end
|
|
28
|
+
CASE_ST
|
|
29
|
+
when_clause = ast("when good Task1", :when_clause)
|
|
30
|
+
else_clause = ast("else Task2", :else_clause)
|
|
31
|
+
expected = [:case_st, nil, when_clause, else_clause]
|
|
32
|
+
ast(expr, :case_st).should eq(expected)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'supports an optional variable name' do
|
|
36
|
+
expr = <<-CASE_ST.strip
|
|
37
|
+
case someVariable
|
|
38
|
+
when good
|
|
39
|
+
Task1
|
|
40
|
+
end
|
|
41
|
+
CASE_ST
|
|
42
|
+
expected = [:var_ref, "someVariable"]
|
|
43
|
+
ast(expr, :case_st)[1].should eq(expected)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe ElseClause, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "else Task1"
|
|
7
|
+
expected = \
|
|
8
|
+
[:else_clause, [:task_call_st, "Task1"]]
|
|
9
|
+
ast(expr, :else_clause).should eq(expected)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe ElsifClause, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "elsif goodCond Task1"
|
|
7
|
+
expected = \
|
|
8
|
+
[:elsif_clause,
|
|
9
|
+
[:bool_expr, [:var_ref, "goodCond"]],
|
|
10
|
+
[:task_call_st, "Task1"]]
|
|
11
|
+
ast(expr, :elsif_clause).should eq(expected)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe EventSet, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'converts empty lists as expected' do
|
|
6
|
+
expr = '{ }'
|
|
7
|
+
expected = [:event_set]
|
|
8
|
+
ast(expr, :event_set).should eq(expected)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'converts singleton lists as expected' do
|
|
12
|
+
expr = '{Diagnosis:start}'
|
|
13
|
+
expected = [:event_set, "Diagnosis:start"]
|
|
14
|
+
ast(expr, :event_set).should eq(expected)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'converts non empty lists as expected' do
|
|
18
|
+
expr = '{Diagnosis:start, an_event, another_one}'
|
|
19
|
+
expected = [:event_set, "Diagnosis:start", "an_event", "another_one"]
|
|
20
|
+
ast(expr, :event_set).should eq(expected)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe FluentDef, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'converts fluent definitions as expected' do
|
|
6
|
+
defn = "fluent diagKnown {Diagnosis:start, diagnosis}, {Treatment:end} initially false"
|
|
7
|
+
expected = [:fluent_def,
|
|
8
|
+
"diagKnown",
|
|
9
|
+
[:event_set, "Diagnosis:start", "diagnosis"],
|
|
10
|
+
[:event_set, "Treatment:end"],
|
|
11
|
+
false]
|
|
12
|
+
ast(defn, :fluent_def).should eq(expected)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'does not require the initial value' do
|
|
16
|
+
defn = "fluent diagKnown {Diagnosis:start, diagnosis}, {Treatment:end}"
|
|
17
|
+
expected = [:fluent_def,
|
|
18
|
+
"diagKnown",
|
|
19
|
+
[:event_set, "Diagnosis:start", "diagnosis"],
|
|
20
|
+
[:event_set, "Treatment:end"],
|
|
21
|
+
nil]
|
|
22
|
+
ast(defn, :fluent_def).should eq(expected)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe IfSt, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "if goodCond Task1 end"
|
|
7
|
+
expected = \
|
|
8
|
+
[:if_st,
|
|
9
|
+
[:bool_expr, [:var_ref, "goodCond"]],
|
|
10
|
+
[:task_call_st, "Task1"]]
|
|
11
|
+
ast(expr, :if_st).should eq(expected)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'supports a else clause' do
|
|
15
|
+
expr = "if goodCond Task1 else Task2 end"
|
|
16
|
+
expected = \
|
|
17
|
+
[:if_st,
|
|
18
|
+
[:bool_expr, [:var_ref, "goodCond"]],
|
|
19
|
+
[:task_call_st, "Task1"],
|
|
20
|
+
[:else_clause, [:task_call_st, "Task2"]] ]
|
|
21
|
+
ast(expr, :if_st).should eq(expected)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'supports elsif clauses' do
|
|
25
|
+
expr = "if goodCond Task1 elsif otherCond Task2 elsif stillAnother Task3 else Task4 end"
|
|
26
|
+
expected = \
|
|
27
|
+
[:if_st,
|
|
28
|
+
[:bool_expr, [:var_ref, "goodCond"]], [:task_call_st, "Task1"],
|
|
29
|
+
[:elsif_clause,
|
|
30
|
+
[:bool_expr, [:var_ref, "otherCond"]], [:task_call_st, "Task2"]],
|
|
31
|
+
[:elsif_clause,
|
|
32
|
+
[:bool_expr, [:var_ref, "stillAnother"]], [:task_call_st, "Task3"]],
|
|
33
|
+
[:else_clause,
|
|
34
|
+
[:task_call_st, "Task4"]] ]
|
|
35
|
+
ast(expr, :if_st).should eq(expected)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe ParSt, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "par Task1 Task2 end"
|
|
7
|
+
expected = [:par_st, [:task_call_st, "Task1"], [:task_call_st, "Task2"]]
|
|
8
|
+
ast(expr, :par_st).should eq(expected)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe SeqSt, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "seq Task1 Task2 end"
|
|
7
|
+
expected = [:seq_st, [:task_call_st, "Task1"], [:task_call_st, "Task2"]]
|
|
8
|
+
ast(expr, :seq_st).should eq(expected)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe TaskDef, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses an explicit definition as expected' do
|
|
6
|
+
expr = <<-EXPR.strip
|
|
7
|
+
task Task1
|
|
8
|
+
fluent diagKnown {}, {}
|
|
9
|
+
Task2
|
|
10
|
+
end
|
|
11
|
+
EXPR
|
|
12
|
+
expected = \
|
|
13
|
+
[:task_def, "Task1",
|
|
14
|
+
[:fluent_def, "diagKnown", [:event_set], [:event_set], nil],
|
|
15
|
+
[:task_call_st, "Task2"]]
|
|
16
|
+
ast(expr, :task_def).should eq(expected)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'uses :nop_st if no statement' do
|
|
20
|
+
expr = <<-EXPR.strip
|
|
21
|
+
task Task1
|
|
22
|
+
fluent diagKnown {}, {}
|
|
23
|
+
end
|
|
24
|
+
EXPR
|
|
25
|
+
expected = \
|
|
26
|
+
[:task_def, "Task1",
|
|
27
|
+
[:fluent_def, "diagKnown", [:event_set], [:event_set], nil],
|
|
28
|
+
[:nop_st]]
|
|
29
|
+
ast(expr, :task_def).should eq(expected)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'uses :nop_st when empty' do
|
|
33
|
+
expr = <<-EXPR.strip
|
|
34
|
+
task Task1
|
|
35
|
+
end
|
|
36
|
+
EXPR
|
|
37
|
+
expected = \
|
|
38
|
+
[:task_def, "Task1",
|
|
39
|
+
[:nop_st]]
|
|
40
|
+
ast(expr, :task_def).should eq(expected)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe TrackvarDef, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'converts tracking variable definitions as expected' do
|
|
6
|
+
defn = "trackvar mplus {Diagnosis:start}"
|
|
7
|
+
expected = [:trackvar_def,
|
|
8
|
+
"mplus",
|
|
9
|
+
[:event_set, "Diagnosis:start"],
|
|
10
|
+
[:event_set],
|
|
11
|
+
nil]
|
|
12
|
+
ast(defn, :trackvar_def).should eq(expected)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'supports obsolete events and initial value' do
|
|
16
|
+
defn = "trackvar mplus {Diagnosis:start}, {Treatment:end} initially true"
|
|
17
|
+
expected = [:trackvar_def,
|
|
18
|
+
"mplus",
|
|
19
|
+
[:event_set, "Diagnosis:start"],
|
|
20
|
+
[:event_set, "Treatment:end"],
|
|
21
|
+
true]
|
|
22
|
+
ast(defn, :trackvar_def).should eq(expected)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe UnitDef, 'to_ast' do
|
|
4
|
+
|
|
5
|
+
it 'converts a single task definition as expected' do
|
|
6
|
+
expr = <<-UNIT.strip
|
|
7
|
+
task Task1 end
|
|
8
|
+
UNIT
|
|
9
|
+
expected = \
|
|
10
|
+
[:unit_def,
|
|
11
|
+
[:task_def, "Task1", [:nop_st]]]
|
|
12
|
+
ast(expr, :unit_def).should eq(expected)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'accepts multiple task definitions' do
|
|
16
|
+
expr = <<-UNIT.strip
|
|
17
|
+
task Task1 end
|
|
18
|
+
task Task2 end
|
|
19
|
+
UNIT
|
|
20
|
+
expected = \
|
|
21
|
+
[:unit_def,
|
|
22
|
+
[:task_def, "Task1", [:nop_st]],
|
|
23
|
+
[:task_def, "Task2", [:nop_st]] ]
|
|
24
|
+
ast(expr, :unit_def).should eq(expected)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe WhenClause, 'to_ast' do
|
|
4
|
+
|
|
5
|
+
it 'converts a when clause as expected' do
|
|
6
|
+
expr = 'when goodCond Task'
|
|
7
|
+
expected = \
|
|
8
|
+
[:when_clause,
|
|
9
|
+
[:bool_expr, [:var_ref, "goodCond"] ],
|
|
10
|
+
[:task_call_st, "Task"]]
|
|
11
|
+
ast(expr, :when_clause).should eq(expected)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
module Gisele::Language::Syntax
|
|
3
|
+
describe WhileSt, "to_ast" do
|
|
4
|
+
|
|
5
|
+
it 'parses as expected' do
|
|
6
|
+
expr = "while goodCond Task1 end"
|
|
7
|
+
expected = \
|
|
8
|
+
[:while_st,
|
|
9
|
+
[:bool_expr, [:var_ref, "goodCond"]],
|
|
10
|
+
[:task_call_st, "Task1"]]
|
|
11
|
+
ast(expr, :while_st).should eq(expected)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'recognizes implicit sequences' do
|
|
15
|
+
expr = "while goodCond Task1 Task2 end"
|
|
16
|
+
expected = \
|
|
17
|
+
[:while_st,
|
|
18
|
+
[:bool_expr, [:var_ref, "goodCond"]],
|
|
19
|
+
[:seq_st, [:task_call_st, "Task1"], [:task_call_st, "Task2"]]]
|
|
20
|
+
ast(expr, :while_st).should eq(expected)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
describe Gisele do
|
|
3
|
+
include Gisele
|
|
4
|
+
|
|
5
|
+
describe "parse" do
|
|
6
|
+
|
|
7
|
+
it 'works with a file' do
|
|
8
|
+
parsed = parse(fixtures_dir/:tasks/"simple.gis")
|
|
9
|
+
parsed.should be_a(Citrus::Match)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'works on a String' do
|
|
13
|
+
parsed = parse("task Hello end")
|
|
14
|
+
parsed.should be_a(Citrus::Match)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'accepts parse options' do
|
|
18
|
+
parsed = parse("if goodCond Task1 end", :root => :if_st)
|
|
19
|
+
parsed.should be_a(Citrus::Match)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "ast" do
|
|
25
|
+
|
|
26
|
+
it 'accepts parse options' do
|
|
27
|
+
ast = ast(parse("if goodCond Task1 end", :root => :if_st))
|
|
28
|
+
ast.should be_a(Sexpr)
|
|
29
|
+
ast.first.should eq(:if_st)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'sets traceability marks correctly' do
|
|
33
|
+
ast = ast(parse("if goodCond Task1 end", :root => :if_st))
|
|
34
|
+
ast.tracking_markers[:citrus_match].should_not be_nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
fixture_files('tasks/**/*.gis').each do |file|
|
|
38
|
+
it "works on #{file}" do
|
|
39
|
+
parsed = ast(parse(file))
|
|
40
|
+
parsed.should be_a(Array)
|
|
41
|
+
parsed.should be_a(Sexpr)
|
|
42
|
+
parsed.first.should eq(:unit_def)
|
|
43
|
+
if (astfile = file.sub_ext(".ast")).exist?
|
|
44
|
+
parsed.should eq(Kernel::eval(astfile.read, TOPLEVEL_BINDING, astfile.to_s))
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
|
2
|
+
require 'gisele-language'
|
|
3
|
+
|
|
4
|
+
module SpecHelpers
|
|
5
|
+
|
|
6
|
+
def parse(text, rule, consume = true)
|
|
7
|
+
grammar = Gisele::Language::Grammar
|
|
8
|
+
grammar.parse(text, :root => rule, :consume => consume)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def ast(text, rule, consume = true)
|
|
12
|
+
ast = parse(text, rule, consume).to_ast
|
|
13
|
+
unless sexp_grammar[rule] === ast
|
|
14
|
+
raise "expected #{ast} to match #{rule} (#{text})"
|
|
15
|
+
end
|
|
16
|
+
ast
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def fixtures_dir
|
|
20
|
+
(Path.dir/:fixtures)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def fixture_files(glob)
|
|
24
|
+
fixtures_dir.glob(glob)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def sexp_grammar
|
|
28
|
+
Gisele::Language
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def simple_ast
|
|
32
|
+
Gisele::ast(fixtures_dir/:tasks/"simple.gis")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def complete_ast
|
|
36
|
+
Gisele::ast(fixtures_dir/:tasks/"complete.gis")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
RSpec.configure do |c|
|
|
42
|
+
c.include SpecHelpers
|
|
43
|
+
c.extend SpecHelpers
|
|
44
|
+
end
|
data/tasks/gem.rake
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# Installs rake tasks for gemming and packaging
|
|
2
|
+
#
|
|
3
|
+
# This file installs the 'rake package', 'rake gem' tasks and associates
|
|
4
|
+
# (clobber_package, repackage, ...). It is automatically generated by Noe
|
|
5
|
+
# from your .noespec file, and should therefore be configured there, under
|
|
6
|
+
# the variables/rake_tasks/gem entry, as illustrated below:
|
|
7
|
+
#
|
|
8
|
+
# variables:
|
|
9
|
+
# rake_tasks:
|
|
10
|
+
# gem:
|
|
11
|
+
# package_dir: pkg
|
|
12
|
+
# need_tar: false
|
|
13
|
+
# need_tar_gz: false
|
|
14
|
+
# need_tar_bz2: false
|
|
15
|
+
# need_zip: false
|
|
16
|
+
# ...
|
|
17
|
+
#
|
|
18
|
+
# If you have specific needs requiring manual intervention on this file,
|
|
19
|
+
# don't forget to set safe-override to false in your noe specification:
|
|
20
|
+
#
|
|
21
|
+
# template-info:
|
|
22
|
+
# manifest:
|
|
23
|
+
# tasks/gem.rake:
|
|
24
|
+
# safe-override: false
|
|
25
|
+
#
|
|
26
|
+
begin
|
|
27
|
+
require 'rubygems/package_task'
|
|
28
|
+
|
|
29
|
+
# Dynamically load the gem spec
|
|
30
|
+
gemspec_file = File.expand_path('../../gisele-language.gemspec', __FILE__)
|
|
31
|
+
gemspec = Kernel.eval(File.read(gemspec_file))
|
|
32
|
+
|
|
33
|
+
Gem::PackageTask.new(gemspec) do |t|
|
|
34
|
+
|
|
35
|
+
# Name of the package
|
|
36
|
+
t.name = gemspec.name
|
|
37
|
+
|
|
38
|
+
# Version of the package
|
|
39
|
+
t.version = gemspec.version
|
|
40
|
+
|
|
41
|
+
# Directory used to store the package files
|
|
42
|
+
t.package_dir = "pkg"
|
|
43
|
+
|
|
44
|
+
# True if a gzipped tar file (tgz) should be produced
|
|
45
|
+
t.need_tar = false
|
|
46
|
+
|
|
47
|
+
# True if a gzipped tar file (tar.gz) should be produced
|
|
48
|
+
t.need_tar_gz = false
|
|
49
|
+
|
|
50
|
+
# True if a bzip2'd tar file (tar.bz2) should be produced
|
|
51
|
+
t.need_tar_bz2 = false
|
|
52
|
+
|
|
53
|
+
# True if a zip file should be produced (default is false)
|
|
54
|
+
t.need_zip = false
|
|
55
|
+
|
|
56
|
+
# List of files to be included in the package.
|
|
57
|
+
t.package_files = gemspec.files
|
|
58
|
+
|
|
59
|
+
# Tar command for gzipped or bzip2ed archives.
|
|
60
|
+
t.tar_command = "tar"
|
|
61
|
+
|
|
62
|
+
# Zip command for zipped archives.
|
|
63
|
+
t.zip_command = "zip"
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
rescue LoadError
|
|
67
|
+
task :gem do
|
|
68
|
+
abort 'rubygems/package_task is not available. You should verify your rubygems installation'
|
|
69
|
+
end
|
|
70
|
+
task :package do
|
|
71
|
+
abort 'rubygems/package_task is not available. You should verify your rubygems installation'
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Installs a rake task for for running examples written using rspec.
|
|
2
|
+
#
|
|
3
|
+
# This file installs the 'rake spec_test' (aliased as 'rake spec') as well as
|
|
4
|
+
# extends 'rake test' to run spec tests, if any. It is automatically generated
|
|
5
|
+
# by Noe from your .noespec file, and should therefore be configured there,
|
|
6
|
+
# under the variables/rake_tasks/spec_test entry, as illustrated below:
|
|
7
|
+
#
|
|
8
|
+
# variables:
|
|
9
|
+
# rake_tasks:
|
|
10
|
+
# spec_test:
|
|
11
|
+
# pattern: spec/**/*_spec.rb
|
|
12
|
+
# verbose: true
|
|
13
|
+
# rspec_opts: [--color, --backtrace]
|
|
14
|
+
# ...
|
|
15
|
+
#
|
|
16
|
+
# If you have specific needs requiring manual intervention on this file,
|
|
17
|
+
# don't forget to set safe-override to false in your noe specification:
|
|
18
|
+
#
|
|
19
|
+
# template-info:
|
|
20
|
+
# manifest:
|
|
21
|
+
# tasks/spec_test.rake:
|
|
22
|
+
# safe-override: false
|
|
23
|
+
#
|
|
24
|
+
# This file has been written to conform to RSpec v2.4.0. More information about
|
|
25
|
+
# rspec and options of the rake task defined below can be found on
|
|
26
|
+
# http://relishapp.com/rspec
|
|
27
|
+
#
|
|
28
|
+
begin
|
|
29
|
+
require "rspec/core/rake_task"
|
|
30
|
+
desc "Run RSpec code examples"
|
|
31
|
+
RSpec::Core::RakeTask.new(:spec_test) do |t|
|
|
32
|
+
# Glob pattern to match files.
|
|
33
|
+
t.pattern = "spec/**/test_*.rb"
|
|
34
|
+
|
|
35
|
+
# Whether or not to fail Rake when an error occurs (typically when
|
|
36
|
+
# examples fail).
|
|
37
|
+
t.fail_on_error = true
|
|
38
|
+
|
|
39
|
+
# A message to print to stderr when there are failures.
|
|
40
|
+
t.failure_message = nil
|
|
41
|
+
|
|
42
|
+
# Use verbose output. If this is set to true, the task will print the
|
|
43
|
+
# executed spec command to stdout.
|
|
44
|
+
t.verbose = true
|
|
45
|
+
|
|
46
|
+
# Use rcov for code coverage?
|
|
47
|
+
t.rcov = false
|
|
48
|
+
|
|
49
|
+
# Path to rcov.
|
|
50
|
+
t.rcov_path = "rcov"
|
|
51
|
+
|
|
52
|
+
# Command line options to pass to rcov. See 'rcov --help' about this
|
|
53
|
+
t.rcov_opts = []
|
|
54
|
+
|
|
55
|
+
# Command line options to pass to ruby. See 'ruby --help' about this
|
|
56
|
+
t.ruby_opts = []
|
|
57
|
+
|
|
58
|
+
# Path to rspec
|
|
59
|
+
t.rspec_path = "rspec"
|
|
60
|
+
|
|
61
|
+
# Command line options to pass to rspec. See 'rspec --help' about this
|
|
62
|
+
t.rspec_opts = ["--color", "--backtrace"]
|
|
63
|
+
end
|
|
64
|
+
rescue LoadError => ex
|
|
65
|
+
task :spec_test do
|
|
66
|
+
abort 'rspec is not available. In order to run spec, you must: gem install rspec'
|
|
67
|
+
end
|
|
68
|
+
ensure
|
|
69
|
+
task :spec => [:spec_test]
|
|
70
|
+
task :test => [:spec_test]
|
|
71
|
+
end
|