Test corner case 1

pull/281/head
Rick Carlino 2016-10-14 10:12:02 -05:00
parent 0200787b17
commit 2cd7cda0cb
3 changed files with 103 additions and 20 deletions

View File

@ -13,7 +13,7 @@ module CeleryScript
end
class AstNode < AbstractNode
attr_reader :args, :body, :comments, :kind, :parent
attr_reader :args, :body, :comment, :kind, :parent
def initialize(parent = nil, args:, body: nil, comment: "", kind:)
@comment, @kind, @parent = comment, kind, parent

View File

@ -0,0 +1,68 @@
{
"kind": "sequence",
"comment": "Properly formatted, syntactically valid sequence.",
"args": {},
"body": [
{
"kind": "move_absolute",
"args": {
"x": 1,
"y": 2,
"z": 3,
"speed": 4
}
},
{
"kind": "move_relative",
"args": {
"x": 1,
"y": 2,
"z": 3,
"speed": 4
}
},
{
"kind": "write_pin",
"args": {
"pin_number": 1,
"pin_value": 128,
"pin_mode": 1
}
},
{
"kind": "read_pin",
"args": {
"pin_number": 1,
"data_label": "my_pin",
"pin_mode": 1
}
},
{
"kind": "wait",
"args": {
"milliseconds": 500
}
},
{
"kind": "send_message",
"args": {
"message": "Bot at coord {{ x }} {{ y }} {{ z }}."
}
},
{
"kind": "if_statement",
"args": {
"lhs": "x",
"rhs": 300,
"op": "is",
"sub_sequence_id": 456
}
},
{
"kind": "execute",
"args": {
"sub_sequence_id": 123
}
}
]
}

View File

@ -1,35 +1,50 @@
require 'spec_helper'
describe CeleryScript::Checker do
file = File.read("./spec/lib/celery_script/ast_fixture2.json")
file = File.read("./spec/lib/celery_script/ast_fixture3.json")
let(:tree) do
CeleryScript::AstNode.new(JSON.parse(file).deep_symbolize_keys)
end
let (:corpus) do
steps = [ :var_set, :var_get, :move_absolute, :move_relative, :write_pin,
:read_pin, :wait, :send_message, :execute, :if_statement]
CeleryScript::Corpus
.new
.defineArg(:data_label, [String])
.defineArg(:data_type, [String])
.defineArg(:data_value, [String, :var_get])
.defineArg(:x, [Fixnum, :blah]) do |node|
node.invalidate!("NO NO NOE!!!") if node.value < 0
end
.defineNode(:sequence, [:x], [:other, :whatever])
.defineNode(:blah, [:data_value, :data_type])
.defineNode(:var_get, [:data_label])
.defineNode(:whatever, [:data_type, :data_value])
.defineNode(:var_get, [:data_label])
.defineNode(:other, [:data_type, :data_value])
.new
.defineArg(:x, [Fixnum])
.defineArg(:y, [Fixnum])
.defineArg(:z, [Fixnum])
.defineArg(:speed, [Fixnum])
.defineArg(:pin_number, [Fixnum])
.defineArg(:pin_value, [Fixnum])
.defineArg(:pin_mode, [Fixnum])
.defineArg(:data_label, [String])
.defineArg(:data_value, [String])
.defineArg(:data_type, [String])
.defineArg(:milliseconds, [Fixnum])
.defineArg(:message, [String])
.defineArg(:sub_sequence_id, [Fixnum])
.defineArg(:lhs, [String])
.defineArg(:op, [String])
.defineArg(:rhs, [Fixnum])
.defineNode(:var_set, [:data_label, :data_type])
.defineNode(:var_get, [:data_label, :data_type, :data_value],)
.defineNode(:move_absolute, [:x, :y, :z, :speed],)
.defineNode(:move_relative, [:x, :y, :z, :speed],)
.defineNode(:write_pin, [:pin_number, :pin_value, :pin_mode ],)
.defineNode(:read_pin, [:pin_number, :data_label, :pin_mode])
.defineNode(:wait, [:milliseconds])
.defineNode(:send_message, [:message])
.defineNode(:execute, [:sub_sequence_id])
.defineNode(:if_statement, [:lhs, :op, :rhs, :sub_sequence_id])
.defineNode(:sequence, [], steps)
end
it "runs" do
begin
it "runs through a syntactically valid program" do
checker = CeleryScript::Checker.new(tree, corpus)
outcome = checker.run!
rescue CeleryScript::TypeCheckError => e
binding.pry
end
expect(outcome).to be_kind_of(CeleryScript::AstNode)
expect(outcome.comment).to eq("Properly formatted, syntactically valid sequence.")
end
end