lc3spec 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +132 -1
- data/bin/lc3spec +18 -0
- data/lib/lc3spec/base.rb +6 -2
- data/lib/lc3spec/dsl.rb +16 -12
- data/lib/lc3spec/lc3.rb +7 -2
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 702d428ff4102c7ad87b31a65490bbee2e07af52
|
4
|
+
data.tar.gz: a96200247b660e91c42642b8a085bd7609fccf23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22cf5b67474d74a44a70ec88c9f87062009963176bce69968311446598ac2bcdecd0331fa3289eb4f6482152ace6bf618ba511161b2109cd4f7e6c272f8a8a7f
|
7
|
+
data.tar.gz: 300ce687d57e631811f47c636fcd35492358c306a90afd9df8ac938c7f6b7478eeb97d9cd713a639d2775badc7bace67cead4c68215801ed27d8e4c44bb6138e
|
data/README.md
CHANGED
@@ -2,10 +2,141 @@
|
|
2
2
|
|
3
3
|
Testing and grading suite for LC-3 assembly programs
|
4
4
|
|
5
|
+
# Description
|
6
|
+
|
7
|
+
LC3Spec allows you to write tests for LC-3 assembly programs and run
|
8
|
+
them in the lc3sim simulator. LC3Spec handles assembling code and
|
9
|
+
creating temporary directories so that you don't have to.
|
10
|
+
|
11
|
+
LC3Spec executes spec files that each describe a number of tests.
|
12
|
+
Each test runs a new instance of lc3sim and allows you to interact
|
13
|
+
with it programmatically.
|
14
|
+
|
15
|
+
Consider the following assembly file, regs.asm, which is supposed to
|
16
|
+
set registers R0, R1, R2, R3, and R4 to 0, 1, 2, 3, and 4, respectively:
|
17
|
+
|
18
|
+
```
|
19
|
+
.ORIG x4000
|
20
|
+
AND R0, R0, 0
|
21
|
+
ADD R1, R0, 1
|
22
|
+
ADD R2, R0, 2
|
23
|
+
ADD R3, R0, 3
|
24
|
+
HALT
|
25
|
+
.END
|
26
|
+
```
|
27
|
+
|
28
|
+
We can write a spec, spec.rb, to test it:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
#!/usr/bin/env ruby
|
32
|
+
|
33
|
+
require 'lc3spec'
|
34
|
+
|
35
|
+
test 'Register Expectations' do
|
36
|
+
file 'regs'
|
37
|
+
set_breakpoint 'TRAP_HALT'
|
38
|
+
continue
|
39
|
+
|
40
|
+
expect_register R0, 0
|
41
|
+
expect_register R1, 1
|
42
|
+
expect_register R2, 2
|
43
|
+
expect_register R3, 3
|
44
|
+
expect_register R4, 4
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
Running with `ruby spec.rb`:
|
49
|
+
|
50
|
+
```
|
51
|
+
Register Expectations [FAIL]
|
52
|
+
Incorrect R4: expected: x0004, actual: x0000
|
53
|
+
```
|
54
|
+
|
55
|
+
Oops, looks like we forgot to initialize R4. If we go back and add
|
56
|
+
`ADD R4, R0, 4` to regs.asm and rerun the spec, we'll see:
|
57
|
+
|
58
|
+
```
|
59
|
+
Register Expectations [OK]
|
60
|
+
```
|
61
|
+
|
62
|
+
LC3Spec handles assembling files behind the scenes, a temporary directory
|
63
|
+
is created to perform each test and all generated files (.obj, .sym) are
|
64
|
+
discarded at the end of each test.
|
65
|
+
|
66
|
+
## Configuration
|
67
|
+
|
68
|
+
Configuration is performed by using `set :option, value`. Configuration
|
69
|
+
changes can be enclosed in a `configure do ... end` block:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
configure do
|
73
|
+
set :output, 'feedback.txt'
|
74
|
+
set :keep_score, true
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
There are currently two supported options:
|
79
|
+
|
80
|
+
* :output - filename or file to write output to, default is $stdout
|
81
|
+
* :keep_score - whether or not to display score for each test. If false,
|
82
|
+
only `[OK]` or `[FAIL]` are displayed, if true, a fractional score
|
83
|
+
is displayed, e.g., `0/1` or `4/4`
|
84
|
+
|
85
|
+
An example:
|
86
|
+
|
87
|
+
```ruby
|
88
|
+
#!/usr/bin/env ruby
|
89
|
+
|
90
|
+
require 'lc3spec'
|
91
|
+
|
92
|
+
configure do
|
93
|
+
set :output, 'feedback.txt'
|
94
|
+
set :keep_score, true
|
95
|
+
end
|
96
|
+
|
97
|
+
test 'this is worth 1 point', 1 do
|
98
|
+
# ...
|
99
|
+
end
|
100
|
+
|
101
|
+
test 'this is worth 4 points', 4 do
|
102
|
+
# ...
|
103
|
+
end
|
104
|
+
|
105
|
+
test 'this should fail', 2 do
|
106
|
+
set_register R4, 'xFACE'
|
107
|
+
expect_register R4, 'xCAFE'
|
108
|
+
end
|
109
|
+
|
110
|
+
print_score
|
111
|
+
```
|
112
|
+
|
113
|
+
The print_score method prints the total score at the end of the file.
|
114
|
+
Running the above spec will produce the following output in feedback.txt:
|
115
|
+
|
116
|
+
```
|
117
|
+
this is worth 1 point 1/1
|
118
|
+
this is worth 4 points 4/4
|
119
|
+
this should fail 0/2
|
120
|
+
Incorrect R4: expected: xCAFE, actual: xFACE
|
121
|
+
|
122
|
+
Score: 5/7
|
123
|
+
```
|
124
|
+
|
5
125
|
# Requirements
|
6
126
|
|
7
127
|
* [lc3tools for unix](http://highered.mcgraw-hill.com/sites/0072467509/student_view0/lc-3_simulator.html)
|
8
|
-
* Ruby 2.0 (Does not work with 1.8.7, untested with 1.9.*)
|
128
|
+
* Ruby 2.0.0 (Does not work with 1.8.7, untested with 1.9.*)
|
129
|
+
|
130
|
+
# Install
|
131
|
+
|
132
|
+
```
|
133
|
+
gem install lc3spec
|
134
|
+
```
|
135
|
+
|
136
|
+
# TODO
|
137
|
+
|
138
|
+
* Documentation
|
139
|
+
* Tests
|
9
140
|
|
10
141
|
# Bugs
|
11
142
|
|
data/bin/lc3spec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'lc3spec'
|
4
|
+
|
5
|
+
if ARGV.empty?
|
6
|
+
puts "Usage: lc3spec <spec-file>"
|
7
|
+
exit false
|
8
|
+
end
|
9
|
+
|
10
|
+
ARGV.each do |arg|
|
11
|
+
if not File.readable? arg
|
12
|
+
raise ArgumentError, "Cannot open #{arg} for reading."
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
ARGV.each do |arg|
|
17
|
+
load arg
|
18
|
+
end
|
data/lib/lc3spec/base.rb
CHANGED
@@ -96,9 +96,13 @@ module LC3Spec
|
|
96
96
|
|
97
97
|
def method_missing(method_name, *arguments, &block)
|
98
98
|
if @lc3.respond_to? method_name
|
99
|
-
@lc3.send(method_name, *arguments, &block)
|
99
|
+
res = @lc3.send(method_name, *arguments, &block)
|
100
100
|
|
101
|
-
|
101
|
+
if method_name.to_s =~ /^get_/
|
102
|
+
res
|
103
|
+
else
|
104
|
+
self
|
105
|
+
end
|
102
106
|
elsif method_name.to_s =~ /^expect_/
|
103
107
|
LC3Spec::Expectations.send(method_name, @lc3, @reporter, *arguments, &block)
|
104
108
|
|
data/lib/lc3spec/dsl.rb
CHANGED
@@ -1,11 +1,21 @@
|
|
1
1
|
module LC3Spec
|
2
2
|
module Dsl
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
def self.extended(base)
|
4
|
+
base.instance_eval do
|
5
|
+
@options ||= {
|
6
|
+
:output => $stdout,
|
7
|
+
:keep_score => false
|
8
|
+
}
|
9
|
+
|
10
|
+
@possible_points ||= 0
|
11
|
+
@earned_points ||= 0
|
12
|
+
|
13
|
+
@num_tests ||= 0
|
14
|
+
@num_passed ||= 0
|
15
|
+
end
|
16
|
+
end
|
8
17
|
|
18
|
+
def set(option, value = true)
|
9
19
|
if option == :output
|
10
20
|
case value
|
11
21
|
when File
|
@@ -76,21 +86,15 @@ module LC3Spec
|
|
76
86
|
end
|
77
87
|
|
78
88
|
def count_points(result, possible)
|
79
|
-
@possible_points ||= 0
|
80
|
-
@earned_points ||= 0
|
81
|
-
|
82
89
|
@earned_points += result == :pass ? possible : 0
|
83
90
|
@possible_points += possible
|
84
91
|
|
85
|
-
@num_tests ||= 0
|
86
92
|
@num_tests += 1
|
87
|
-
|
88
|
-
@num_passed ||= 0
|
89
93
|
@num_passed += result == :pass ? 1 : 0
|
90
94
|
end
|
91
95
|
|
92
96
|
def print_score
|
93
|
-
return if @num_tests
|
97
|
+
return if @num_tests == 0
|
94
98
|
|
95
99
|
output = @options[:output]
|
96
100
|
|
data/lib/lc3spec/lc3.rb
CHANGED
@@ -41,11 +41,12 @@ class LC3
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def get_register(reg)
|
44
|
+
reg = reg.to_s.upcase.to_sym # Ruby 1.8 doesn't support Symbol#upcase
|
44
45
|
@registers[reg]
|
45
46
|
end
|
46
47
|
|
47
48
|
def set_register(reg, val)
|
48
|
-
reg = reg.upcase # Don't use ! version because it doesn't work for symbols
|
49
|
+
reg = reg.to_s.upcase # Don't use ! version because it doesn't work for symbols
|
49
50
|
|
50
51
|
unless @registers.keys.include? reg.to_sym
|
51
52
|
raise "Invalid register: #{reg.to_s}"
|
@@ -195,8 +196,12 @@ class LC3
|
|
195
196
|
|
196
197
|
# There is no signal that tells the GUI that output is ready...
|
197
198
|
# FIXME: This is a bug waiting to happen
|
199
|
+
retries = 10
|
198
200
|
until @output.ready?
|
199
|
-
sleep(0.
|
201
|
+
sleep(0.1)
|
202
|
+
|
203
|
+
retries -= 1
|
204
|
+
break if retries <= 0
|
200
205
|
end
|
201
206
|
|
202
207
|
while @output.ready?
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lc3spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chun Yang
|
@@ -12,7 +12,8 @@ date: 2013-02-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies: []
|
13
13
|
description: DSL for testing LC-3 assembly programs
|
14
14
|
email: x@cyang.info
|
15
|
-
executables:
|
15
|
+
executables:
|
16
|
+
- lc3spec
|
16
17
|
extensions: []
|
17
18
|
extra_rdoc_files: []
|
18
19
|
files:
|
@@ -26,6 +27,7 @@ files:
|
|
26
27
|
- lib/lc3spec/lc3.rb
|
27
28
|
- lib/lc3spec/main.rb
|
28
29
|
- lib/lc3spec/reporter.rb
|
30
|
+
- bin/lc3spec
|
29
31
|
- LICENSE
|
30
32
|
- README.md
|
31
33
|
homepage: http://github.com/chunyang/lc3spec
|
@@ -40,7 +42,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
40
42
|
requirements:
|
41
43
|
- - '>='
|
42
44
|
- !ruby/object:Gem::Version
|
43
|
-
version:
|
45
|
+
version: 1.9.3
|
44
46
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
47
|
requirements:
|
46
48
|
- - '>='
|
@@ -53,3 +55,4 @@ signing_key:
|
|
53
55
|
specification_version: 4
|
54
56
|
summary: Testing and grading suite for LC-3 assembly programs
|
55
57
|
test_files: []
|
58
|
+
has_rdoc:
|