rockit 0.7.1 → 0.7.2

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.
Files changed (73) hide show
  1. data/README +24 -160
  2. data/TODO +17 -17
  3. data/VERSION +1 -1
  4. data/doc/rockit_paper.pdf +0 -0
  5. data/lib/packrat/grammar.rb +139 -84
  6. data/rakefile +27 -9
  7. data/tests/acceptance/packrat/java/atest_java.rb +37 -0
  8. data/tests/acceptance/packrat/java/java.rb +136 -0
  9. data/tests/acceptance/packrat/java/t.rb +10 -0
  10. data/tests/acceptance/packrat/java/todo +10 -0
  11. data/tests/acceptance/packrat/java/xtc.lang.java/Java.rats +446 -0
  12. data/tests/acceptance/packrat/java/xtc.lang.java/JavaConstant.rats +111 -0
  13. data/tests/acceptance/packrat/java/xtc.lang.java/JavaCore.rats +508 -0
  14. data/tests/acceptance/packrat/java/xtc.lang.java/JavaIdentifier.rats +62 -0
  15. data/tests/acceptance/packrat/java/xtc.lang.java/JavaSymbol.rats +38 -0
  16. data/tests/acceptance/packrat/java/xtc.lang.java/JavaTree.rats +40 -0
  17. data/tests/acceptance/packrat/java/xtc.lang.java/JavaType.rats +61 -0
  18. data/tests/acceptance/packrat/java/xtc.lang.java/Spacing.rats +36 -0
  19. data/tests/acceptance/packrat/java/xtc.lang.java/Symbol.rats +77 -0
  20. data/tests/acceptance/packrat/minibasic/README +13 -0
  21. data/tests/acceptance/packrat/minibasic/atest_minibasic.rb +151 -13
  22. data/tests/acceptance/packrat/minibasic/minibasic.rb +94 -76
  23. data/tests/acceptance/packrat/minibasic/mult3.basic +6 -0
  24. data/tests/acceptance/packrat/minibasic/sumeven.basic +19 -0
  25. data/tests/unit/packrat/test_ast.rb +116 -0
  26. data/tests/unit/packrat/test_interpreting_parser.rb +15 -55
  27. metadata +22 -59
  28. data/lib/rockit/prettyprint/box.rb +0 -60
  29. data/lib/rockit/prettyprint/renderer.rb +0 -41
  30. data/lib/rockit/prettyprint/text_renderer.rb +0 -47
  31. data/lib/rockit/tree/base.rb +0 -223
  32. data/lib/rockit/tree/enter_leave_visitor.rb +0 -12
  33. data/lib/rockit/tree/graphviz.rb +0 -69
  34. data/lib/rockit/tree/visitor.rb +0 -12
  35. data/lib/util/array_alternatives.rb +0 -20
  36. data/lib/util/enter_leave_visitor.rb +0 -69
  37. data/lib/util/graphviz_dot.rb +0 -182
  38. data/lib/util/string_location.rb +0 -42
  39. data/lib/util/visitor.rb +0 -49
  40. data/lib/util/visitor_combinators.rb +0 -14
  41. data/tests/acceptance/rockit/dparser/atest_any_operator.rb +0 -33
  42. data/tests/acceptance/rockit/dparser/atest_arithmetic_grammar.rb +0 -30
  43. data/tests/acceptance/rockit/dparser/atest_list_operator.rb +0 -57
  44. data/tests/acceptance/rockit/dparser/atest_mult_operator.rb +0 -60
  45. data/tests/acceptance/rockit/dparser/atest_operator_grammar.rb +0 -61
  46. data/tests/acceptance/rockit/dparser/atest_plus_operator.rb +0 -55
  47. data/tests/acceptance/rockit/dparser/atest_samples_calculator.rb +0 -14
  48. data/tests/acceptance/rockit/dparser/atest_samples_minibasic.rb +0 -20
  49. data/tests/acceptance/rockit/dparser/atest_samples_multifunccalculator.rb +0 -36
  50. data/tests/acceptance/rockit/dparser/atest_simple_grammar.rb +0 -34
  51. data/tests/acceptance/rockit/dparser/atest_speculative_code_action.rb +0 -128
  52. data/tests/acceptance/rockit/dparser/calc_tests_common.rb +0 -103
  53. data/tests/unit/parse/utest_ebnf_grammar.rb +0 -50
  54. data/tests/unit/parse/utest_expand_grammar.rb +0 -23
  55. data/tests/unit/parse/utest_grammar.rb +0 -160
  56. data/tests/unit/rockit/assembler/llvm/utest_instructions.rb +0 -41
  57. data/tests/unit/rockit/assembler/llvm/utest_module.rb +0 -19
  58. data/tests/unit/rockit/prettyprint/utest_box.rb +0 -44
  59. data/tests/unit/rockit/tree/utest_tree_base.rb +0 -301
  60. data/tests/unit/rockit/tree/utest_tree_enter_leave_visitor.rb +0 -69
  61. data/tests/unit/rockit/tree/utest_tree_visitor.rb +0 -63
  62. data/tests/unit/rockit/utest_grammar.rb +0 -145
  63. data/tests/unit/rockit/utest_grammar_symbol.rb +0 -11
  64. data/tests/unit/rockit/utest_maybe_operator.rb +0 -12
  65. data/tests/unit/rockit/utest_regexp_terminal.rb +0 -45
  66. data/tests/unit/rockit/utest_repetition_operators.rb +0 -35
  67. data/tests/unit/rockit/utest_rule.rb +0 -23
  68. data/tests/unit/rockit/utest_string_terminal.rb +0 -40
  69. data/tests/unit/util/utest_array_alternatives.rb +0 -23
  70. data/tests/unit/util/utest_enter_leave_visitor.rb +0 -89
  71. data/tests/unit/util/utest_string_location.rb +0 -42
  72. data/tests/unit/util/utest_visitor.rb +0 -92
  73. data/tests/unit/util/utest_visitor_combinators.rb +0 -64
@@ -0,0 +1,62 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2005 Robert Grimm
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Definition of Java identifiers.
22
+ *
23
+ * @author Robert Grimm
24
+ * @version $Revision: 1.4 $
25
+ */
26
+ module xtc.lang.JavaIdentifier(Symbol, Spacing);
27
+
28
+ import Symbol;
29
+ import Spacing;
30
+
31
+ body {
32
+ static {
33
+ reserve(new String[] {
34
+ "abstract", "default", "if", "private", "this",
35
+ "boolean", "do", "implements", "protected", "throw",
36
+ "break", "double", "import", "public", "throws",
37
+ "byte", "else", "instanceof", "return", "transient",
38
+ "case", "extends", "int", "short", "try",
39
+ "catch", "final", "interface", "static", "void",
40
+ "char", "finally", "long", "strictfp", "volatile",
41
+ "class", "float", "native", "super", "while",
42
+ "const", "for", "new", "switch",
43
+ "continue", "goto", "package", "synchronized"
44
+ });
45
+ }
46
+ }
47
+
48
+ option reserved;
49
+
50
+ generic QualifiedIdentifier =
51
+ Identifier ( void:".":Symbol Identifier )*
52
+ ;
53
+
54
+ String Identifier =
55
+ yyValue:Word &{ ! RESERVED.contains(yyValue) } ;
56
+
57
+ String Word = WordCharacters Spacing ;
58
+
59
+ transient String WordCharacters =
60
+ start:_ &{ Character.isJavaIdentifierStart(start) }
61
+ ( part:_ &{ Character.isJavaIdentifierPart(part) } )*
62
+ ;
@@ -0,0 +1,38 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2005 Robert Grimm
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Definition of Java symbols.
22
+ *
23
+ * @author Robert Grimm
24
+ * @version $Revision: 1.2 $
25
+ */
26
+ module xtc.lang.JavaSymbol(Symbol);
27
+
28
+ modify Symbol;
29
+
30
+ String SymbolCharacters +=
31
+ <TripleGreaterEqual> ">>>="
32
+ / <GreaterGreaterEqual> ...
33
+ ;
34
+
35
+ String SymbolCharacters +=
36
+ <TripleGreater> ">>>"
37
+ / <GreaterGreater> ...
38
+ ;
@@ -0,0 +1,40 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2004-2005 Robert Grimm, New York University
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Java grammar with AST support.
22
+ *
23
+ * @author Stacey Kuznetsov
24
+ * @author Robert Grimm
25
+ * @version $Revision: 1.7 $
26
+ */
27
+ module xtc.lang.JavaTree;
28
+
29
+ instantiate xtc.lang.JavaType(xtc.lang.JavaIdentifier, xtc.lang.JavaSymbol);
30
+ instantiate xtc.lang.JavaConstant(xtc.lang.JavaIdentifier, xtc.util.Spacing);
31
+ instantiate xtc.lang.JavaIdentifier(xtc.lang.JavaSymbol, xtc.util.Spacing);
32
+ instantiate xtc.util.Symbol(xtc.util.Spacing);
33
+ instantiate xtc.lang.JavaSymbol(xtc.util.Symbol);
34
+ instantiate xtc.util.Spacing;
35
+
36
+ modify xtc.lang.JavaCore(xtc.lang.JavaType, xtc.lang.JavaConstant,
37
+ xtc.lang.JavaIdentifier, xtc.lang.JavaSymbol,
38
+ xtc.util.Spacing);
39
+
40
+ option withLocation, constant, parser(xtc.lang.JavaTreeParser);
@@ -0,0 +1,61 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2004-2005 Robert Grimm, New York University
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Definition of Java type names.
22
+ *
23
+ * @author Stacey Kuznetsov
24
+ * @author Robert Grimm
25
+ * @version $Revision: 1.3 $
26
+ */
27
+ module xtc.lang.JavaType(Identifier, Symbol);
28
+
29
+ import Identifier;
30
+ import Symbol;
31
+
32
+ GNode ResultType =
33
+ <Void> VoidTypeSpecifier
34
+ / <Regular> Type
35
+ ;
36
+
37
+ generic VoidTypeSpecifier = <Void> void:"void":Word;
38
+
39
+ generic Type =
40
+ <Type> TypeName Dimensions?
41
+ ;
42
+
43
+ generic TypeName =
44
+ <Basic> BasicType
45
+ / <Qualified> yyValue:QualifiedIdentifier
46
+ ;
47
+
48
+ String BasicType =
49
+ <Byte> "byte":Word
50
+ / <Short> "short":Word
51
+ / <Char> "char":Word
52
+ / <Int> "int":Word
53
+ / <Long> "long":Word
54
+ / <Float> "float":Word
55
+ / <Double> "double":Word
56
+ / <Boolean> "boolean":Word
57
+ ;
58
+
59
+ generic Dimensions =
60
+ ( "[":Symbol void:"]":Symbol )+
61
+ ;
@@ -0,0 +1,36 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2005 Robert Grimm
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Definition of spacing, including C comments.
22
+ *
23
+ * @author Robert Grimm
24
+ * @version $Revision: 1.3 $
25
+ */
26
+ module xtc.util.Spacing;
27
+
28
+ transient void Spacing =
29
+ ( Space / LineTerminator / TraditionalComment / EndOfLineComment )*
30
+ ;
31
+
32
+ transient void Space = ' ' / '\t' / '\f' ;
33
+ transient void TraditionalComment = "/*" ( '*' !'/' / !'*' _ )* "*/" ;
34
+ transient void EndOfLineComment = "//" ( ![\n\r] _ )* LineTerminator ;
35
+ transient void LineTerminator = '\r' '\n' / '\r' / '\n' ;
36
+ transient void EndOfFile = !_ ;
@@ -0,0 +1,77 @@
1
+ /*
2
+ * xtc - The eXTensible Compiler
3
+ * Copyright (C) 2005 Robert Grimm
4
+ *
5
+ * This program is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU General Public License
7
+ * as published by the Free Software Foundation; either version 2
8
+ * of the License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ */
19
+
20
+ /**
21
+ * Definition of symbols common to C and Java.
22
+ *
23
+ * @author Robert Grimm
24
+ * @version $Revision: 1.6 $
25
+ */
26
+ module xtc.util.Symbol(Spacing);
27
+
28
+ import Spacing;
29
+
30
+ String Symbol = SymbolCharacters Spacing ;
31
+
32
+ transient String SymbolCharacters =
33
+ <GreaterGreaterEqual> ">>="
34
+ / <LessLessEqual> "<<="
35
+ / <GreaterGreater> ">>"
36
+ / <LessLess> "<<"
37
+ / <PlusEqual> "+="
38
+ / <MinusEqual> "-="
39
+ / <StarEqual> "*="
40
+ / <SlashEqual> "/="
41
+ / <PercentEqual> "%="
42
+ / <AmpersandEqual> "&="
43
+ / <CaretEqual> "^="
44
+ / <BarEqual> "|="
45
+ / <PlusPlus> "++"
46
+ / <MinusMinus> "--"
47
+ / <AmpersandAmpersand> "&&"
48
+ / <BarBar> "||"
49
+ / <LessEqual> "<="
50
+ / <GreaterEqual> ">="
51
+ / <EqualEqual> "=="
52
+ / <BangEqual> "!="
53
+ / <Semicolon> ";"
54
+ / <Colon> ":"
55
+ / <Comma> ","
56
+ / <Period> "."
57
+ / <OpenBrace> "{"
58
+ / <CloseBrace> "}"
59
+ / <OpenParenthesis> "("
60
+ / <CloseParenthesis> ")"
61
+ / <OpenBracket> "["
62
+ / <CloseBracket> "]"
63
+ / <Bang> "!"
64
+ / <Tilde> "~"
65
+ / <Plus> "+"
66
+ / <Minus> "-"
67
+ / <Star> "*"
68
+ / <Slash> "/"
69
+ / <Percent> "%"
70
+ / <Less> "<"
71
+ / <Greater> ">"
72
+ / <Equal> "="
73
+ / <Ampersand> "&"
74
+ / <Caret> "^"
75
+ / <Bar> "|"
76
+ / <Question> "?"
77
+ ;
@@ -0,0 +1,13 @@
1
+ You can interpret MiniBasic programs by running
2
+
3
+ ruby minibasic.rb program_filename
4
+
5
+ Example 1.
6
+
7
+ $ ruby -I../../../../lib mult3.basic
8
+ ...
9
+
10
+ Example 2.
11
+
12
+ $ ruby -I../../../../lib sumeven.basic
13
+ ...
@@ -2,7 +2,7 @@ require 'test/unit'
2
2
 
3
3
  require File.join(File.dirname(__FILE__), "minibasic")
4
4
 
5
- class ATestMiniBasic < Test::Unit::TestCase
5
+ class ATestMiniBasicParse < Test::Unit::TestCase
6
6
  def assert_parse(exp, str)
7
7
  res = MiniBasic::Parser.parse_string(str)
8
8
  assert_equal(exp, res)
@@ -15,31 +15,169 @@ class ATestMiniBasic < Test::Unit::TestCase
15
15
  include MiniBasic::Grammar::ASTs
16
16
 
17
17
  def test_01
18
- assert_stmt(PrintLn["PRINTLN"], "PRINTLN")
18
+ assert_stmt(PrintLn[], "PRINTLN")
19
19
  end
20
20
 
21
21
  def test_02
22
- assert_stmt(Read["READ", :A], "READ A")
22
+ assert_stmt(Read[:A], "READ A")
23
23
  end
24
24
 
25
25
  def test_03
26
- assert_stmt(Print["PRINT", :BC], "PRINT BC")
26
+ assert_stmt(Print[:BC], "PRINT BC")
27
27
  end
28
28
 
29
29
  def test_04
30
- assert_stmt(Assign[:D, ":=", 1], "D := 1")
31
- assert_stmt(Assign[:D, ":=", 1], "D :=1")
32
- assert_stmt(Assign[:D, ":=", 1], "D:=1")
30
+ assert_stmt(Assign[:D, 1], "D := 1")
31
+ assert_stmt(Assign[:D, 1], "D :=1")
32
+ assert_stmt(Assign[:D, 1], "D:=1")
33
33
  end
34
34
 
35
35
  def test_05
36
- assert_stmt(For["FOR", :A, ":=", 1, "TO", 3,
37
- [Assign[:S, ":=", OpExpr[:S, "+", :A]],
38
- Print["PRINT", :S],
39
- ],
40
- "NEXT"], "FOR A := 1 TO 3 S:= S + A PRINT S NEXT")
36
+ assert_stmt(For[:A, 1, 3,
37
+ [Assign[:S, BinExpr[:S, "+", :A]],
38
+ Print[:S]]],
39
+ "FOR A := 1 TO 3 S:= S + A PRINT S NEXT")
41
40
  end
42
41
 
43
- def atest_06
42
+ def test_06_if_without_else
43
+ assert_stmt(If[Cond[3, ">", 1], [PrintLn[]], nil],
44
+ "IF 3 > 1 THEN PRINTLN ENDIF")
45
+ end
46
+
47
+ def test_06_if_with_else
48
+ assert_stmt(If[Cond[3, ">", 1],
49
+ [Print[:A], PrintLn[]],
50
+ [Print[:B], PrintLn[]]],
51
+ "IF 3 > 1 THEN PRINT A PRINTLN ELSE PRINT B PRINTLN ENDIF")
52
+ end
53
+
54
+ def test_07_string
55
+ assert_stmt(Assign[:A, "H"], "A := \"H\"")
56
+ end
57
+ end
58
+
59
+ class ATestMiniBasicInterpret < Test::Unit::TestCase
60
+ def interpret(prg, options = {})
61
+ i = MiniBasic::Interpreter.new(options)
62
+ ast = MiniBasic::Parser.parse_string(prg)
63
+ res = i.interpret(ast)
64
+ return i, res, ast
65
+ end
66
+
67
+ def interp(prg, options = {})
68
+ interpret(prg, options).first
69
+ end
70
+
71
+ NoIndata = ("__" + rand(1e10).to_s).intern
72
+
73
+ def test_01_assignment
74
+ i = interp("A:=1")
75
+ assert_equal({:A => 1}, i.vars)
76
+
77
+ i = interp("A:=1 B := 2 C:= 3 D := 4")
78
+ assert_equal({:A => 1, :B => 2, :C => 3, :D => 4},
79
+ i.vars)
80
+ end
81
+
82
+ def test_02_if
83
+ i = interp("A := 1 IF A > 1 THEN A := 1 ELSE A := 0 ENDIF")
84
+ assert_equal({:A => 0}, i.vars)
85
+
86
+ i = interp("A := 1 IF A = 1 THEN B := 2 ELSE A := 0 ENDIF")
87
+ assert_equal({:A => 1, :B => 2}, i.vars)
88
+ end
89
+
90
+ def test_03_for
91
+ i = interp("S := 1 FOR I := 1 TO 4 S := S + I NEXT")
92
+ assert_equal({:S => 11, :I => 4}, i.vars)
93
+ end
94
+
95
+ def test_04_string
96
+ i = interp('A := "Hello World!"')
97
+ assert_equal({:A => "Hello World!"}, i.vars)
98
+ end
99
+
100
+ class MockStdin
101
+ def initialize(*lines)
102
+ @lines, @cnt = lines, -1
103
+ end
104
+ def gets; @lines[(@cnt += 1)]; end
105
+ end
106
+
107
+ class MockStdout
108
+ attr_reader :strs
109
+ def initialize
110
+ @strs = []
111
+ end
112
+ def print(str); @strs << str; end
113
+ def flush; end
114
+ end
115
+
116
+ def test_05_read
117
+ i = interp("READ A", :stdin => MockStdin.new("452"),
118
+ :stdout => (so = MockStdout.new))
119
+ assert_equal({:A => 452}, i.vars)
120
+ assert_equal(["? "], so.strs)
121
+ end
122
+
123
+ def test_06_print
124
+ i = interp("A := 1 PRINT A", :stdout => (so = MockStdout.new))
125
+ assert_equal({:A => 1}, i.vars)
126
+ assert_equal(["1"], so.strs)
127
+ end
128
+
129
+ def test_07_println
130
+ i = interp("PRINTLN", :stdout => (so = MockStdout.new))
131
+ assert_equal({}, i.vars)
132
+ assert_equal(["\n"], so.strs)
133
+ end
134
+
135
+ def assert_prg(filename, stdInLines, expStdoutStrs)
136
+ fn = File.join(File.dirname(__FILE__), filename)
137
+ prg = File.open(fn) {|fh| fh.read}
138
+ stdout = MockStdout.new
139
+ stdin = MockStdin.new(*stdInLines)
140
+ i = interp(prg, :stdout => stdout, :stdin => stdin)
141
+ assert_equal(expStdoutStrs, stdout.strs)
142
+ end
143
+
144
+ def assert_mult3(input, out)
145
+ ao =
146
+ ["What is your number", "? ", input.to_s, " * 3 = ", out.to_s, "\n"]
147
+ assert_prg("mult3.basic", [input.to_s], ao)
148
+ end
149
+
150
+ def test_08_mult3
151
+ assert_mult3(0, 0)
152
+ assert_mult3(1, 3)
153
+ assert_mult3(2, 6)
154
+ assert_mult3(10, 30)
155
+ end
156
+
157
+ def assert_sumeven(input, out)
158
+ ao =
159
+ [
160
+ "I can sum even numbers.", "\n",
161
+ "At what number should I start summing", "? ",
162
+ "At what number should I stop", "? ",
163
+ "The sum of all even numbers between (inclusive) ",
164
+ ]
165
+ ao << input[0].to_s
166
+ ao << " and "
167
+ ao << input[1].to_s
168
+ ao << " is = "
169
+ ao << out.to_s
170
+ ao << "\n"
171
+ assert_prg("sumeven.basic", input.map {|i| i.to_s}, ao)
172
+ end
173
+
174
+ def test_09_sumeven_program_file
175
+ assert_sumeven([0, 1], 0)
176
+ assert_sumeven([1, 1], 0)
177
+ assert_sumeven([1, 4], 6)
178
+ assert_sumeven([1, 5], 6)
179
+ assert_sumeven([1, 6], 12)
180
+ assert_sumeven([1, 8], 20)
181
+ assert_sumeven([1, 10], 30)
44
182
  end
45
183
  end