noofakku 0.0.1 → 0.0.4

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.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NjY3NzRkNDgzZGMzODRhODhmMjc3N2FmNTQ2NTY2Zjk2OWU1NzZhMQ==
4
+ N2ZkOGJhOTI5MWJkMWU3NzhiYWYyZmU0NWVlNTQ5MGRjM2UyZDczNw==
5
5
  data.tar.gz: !binary |-
6
- YjRhMTU1ZjJkNmVmN2IyNzE1MWZlODEyMWQxOWVmOGMwNmExZWFhMQ==
6
+ NWYxNjQyNjk1ZmU2YTc3NTE2YzM3NjlmMTUyYzVmZTVkODg2MzY0NQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YWIxZjA3OGY0OTI4MGFkZDU3YmYxZWQyOWFmMTMyODQzZjg5M2EwYTU5MGNm
10
- YjViODJlZWVjNGIzNTg0ODRkYzBiYTJjY2VjMjA2OWIwYWU1ODlhMzczNTdi
11
- YWJmNDIxZTM4N2ZiZjhhNWJkNWQ5ZmE0YzU2ZjIwY2MyMzE5NmQ=
9
+ NWRiOTI4MTM0NmFmOTZkYmZmZjI4YjU0YjljMTMzMzdiMjIzZDU2MDJlZGQ1
10
+ MGUyN2U1NmNmZTNjMDI5ZmJlYjA0NTc3OGFhOGEzMGQ5NWY4ZmE0ZTczNDYz
11
+ NjczNmI1MGQwYjgxNDUzM2QzZTVkOWY0NDg4OWI0YWZhOWNlZGM=
12
12
  data.tar.gz: !binary |-
13
- YzIyMWEwMTI4ZDY0NzMyNTYwMDBlYmE2YzM4NzM4NjY4YjAzMWVlM2MyZWRj
14
- ZjZiMzU3MGFkYzJjYjllZWExZGRmNDQ3MGE3NjRjMmIyN2YwZDNhYWE2OTE4
15
- ZTRiYTQ5MjBmZWM1ZTJhODFmZTA3MTBiMjQ1ZTZkYWVhNWQ1MDM=
13
+ MjU4ZjMzZjc0NTQ0YTliMjJkOTEwNmEzNDFmOTZlY2RhZGFiNWE5MDBhMmNm
14
+ OGZhMTU2MmM3YjkzZTU1OWMwZWE5MGZiZmQ4ZmRkZjRlYjQ4MTYwOTBjMmQy
15
+ NzAzYmNlMTA0YzViNjZkNTFmZWI0ZGFlNzcyODZiOWJjNGMwNDQ=
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ /coverage
2
+ /*.gem
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ deploy:
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ provider: rubygems
6
+ api_key: "4fa314a48d7f66052bf71f2f97fc543c"
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ noofakku (0.0.4)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ activesupport (4.0.2)
10
+ i18n (~> 0.6, >= 0.6.4)
11
+ minitest (~> 4.2)
12
+ multi_json (~> 1.3)
13
+ thread_safe (~> 0.1)
14
+ tzinfo (~> 0.3.37)
15
+ atomic (1.1.14)
16
+ coveralls (0.7.0)
17
+ multi_json (~> 1.3)
18
+ rest-client
19
+ simplecov (>= 0.7)
20
+ term-ansicolor
21
+ thor
22
+ docile (1.1.1)
23
+ i18n (0.6.9)
24
+ mime-types (2.0)
25
+ minitest (4.7.5)
26
+ multi_json (1.8.2)
27
+ rake (10.1.0)
28
+ rest-client (1.6.7)
29
+ mime-types (>= 1.16)
30
+ shoulda (3.5.0)
31
+ shoulda-context (~> 1.0, >= 1.0.1)
32
+ shoulda-matchers (>= 1.4.1, < 3.0)
33
+ shoulda-context (1.1.6)
34
+ shoulda-matchers (2.4.0)
35
+ activesupport (>= 3.0.0)
36
+ simplecov (0.8.2)
37
+ docile (~> 1.1.0)
38
+ multi_json
39
+ simplecov-html (~> 0.8.0)
40
+ simplecov-html (0.8.0)
41
+ term-ansicolor (1.2.2)
42
+ tins (~> 0.8)
43
+ thor (0.18.1)
44
+ thread_safe (0.1.3)
45
+ atomic
46
+ tins (0.13.1)
47
+ tzinfo (0.3.38)
48
+
49
+ PLATFORMS
50
+ ruby
51
+ x86-mingw32
52
+
53
+ DEPENDENCIES
54
+ coveralls
55
+ noofakku!
56
+ rake
57
+ shoulda
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ Noofakku
2
+ ========
3
+ <a href="http://badge.fury.io/rb/noofakku"><img src="https://badge.fury.io/rb/noofakku@2x.png" alt="Gem Version" height='18'></a>
4
+ <br/>
5
+ <a href="https://travis-ci.org/mcodella/noofakku"><img src="https://travis-ci.org/mcodella/noofakku.png?branch=master" alt="Travis-CI Status" height='18'></a>
6
+ <br/>
7
+ <a href="https://codeclimate.com/github/mcodella/noofakku"><img src="https://codeclimate.com/github/mcodella/noofakku.png" height='18'/></a>
8
+ <br/>
9
+ <a href='https://coveralls.io/r/mcodella/noofakku'><img src='https://coveralls.io/repos/mcodella/noofakku/badge.png' alt='Coverage Status' height='18'/></a>
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << "test"
5
+ t.test_files = FileList['test/**/*_test.rb']
6
+ t.verbose = true
7
+ end
8
+
9
+ task :default => :test
@@ -0,0 +1,28 @@
1
+ module Noofakku
2
+
3
+ class ClosedBracket
4
+
5
+ def initialize(open, closed)
6
+ @open, @closed = open, closed
7
+ end
8
+
9
+ def perform(processor, memory, program, input, output)
10
+ raise "processor cannot be nil" unless processor != nil
11
+ raise "memory cannot be nil" unless memory != nil
12
+ raise "program cannot be nil" unless program != nil
13
+ raise "instruction pointer must point to a '#{@closed}'" unless program[processor.instruction_pointer] == @closed
14
+ if memory[processor.data_pointer] == 0 then return end
15
+ unmatched_brackets = 1
16
+ pointer_to_current_instruction = processor.instruction_pointer
17
+ until unmatched_brackets == 0
18
+ processor.instruction_pointer -= 1
19
+ if processor.instruction_pointer == -1 then raise "no matching '#{@open}' for '#{@closed}' at #{pointer_to_current_instruction}"
20
+ elsif program[processor.instruction_pointer] == @closed then unmatched_brackets += 1
21
+ elsif program[processor.instruction_pointer] == @open then unmatched_brackets -= 1
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,13 @@
1
+ module Noofakku
2
+ class Dec
3
+ def hook
4
+ '-'
5
+ end
6
+
7
+ def perform(processor, memory, program, input, output)
8
+ raise "processor cannot be nil" unless processor != nil
9
+ raise "memory cannot be nil" unless memory != nil
10
+ memory[processor.data_pointer] -= 1
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Noofakku
2
+
3
+ class Inc
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ raise "processor cannot be nil" unless processor != nil
7
+ raise "memory cannot be nil" unless memory != nil
8
+ memory[processor.data_pointer] += 1
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,14 @@
1
+ module Noofakku
2
+
3
+ class Input
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ raise "processor cannot be nil" unless processor != nil
7
+ raise "memory cannot be nil" unless memory != nil
8
+ raise "input cannot be nil" unless input != nil
9
+ memory[processor.data_pointer] = input.call
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,12 @@
1
+ module Noofakku
2
+
3
+ class Next
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ raise "processor cannot be nil" unless processor != nil
7
+ processor.data_pointer += 1
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ module Noofakku
2
+
3
+ class Noop
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ # lazyness is prevailing over me... :(
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,28 @@
1
+ module Noofakku
2
+
3
+ class OpenBracket
4
+
5
+ def initialize(open, closed)
6
+ @open, @closed = open, closed
7
+ end
8
+
9
+ def perform(processor, memory, program, input, output)
10
+ raise "processor cannot be nil" unless processor != nil
11
+ raise "memory cannot be nil" unless memory != nil
12
+ raise "program cannot be nil" unless program != nil
13
+ raise "instruction pointer must point to a '#{@open}'" unless program[processor.instruction_pointer] == @open
14
+ if memory[processor.data_pointer] != 0 then return end
15
+ unmatched_brackets = 1
16
+ pointer_to_current_instruction = processor.instruction_pointer
17
+ until unmatched_brackets == 0
18
+ processor.instruction_pointer += 1
19
+ if processor.instruction_pointer == program.length then raise "no matching '#{@closed}' for '#{@open}' at #{pointer_to_current_instruction}"
20
+ elsif program[processor.instruction_pointer] == @open then unmatched_brackets += 1
21
+ elsif program[processor.instruction_pointer] == @closed then unmatched_brackets -= 1
22
+ end
23
+ end
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,14 @@
1
+ module Noofakku
2
+
3
+ class Output
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ raise "processor cannot be nil" unless processor != nil
7
+ raise "memory cannot be nil" unless memory != nil
8
+ raise "output cannot be nil" unless output != nil
9
+ output.call(memory[processor.data_pointer])
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,12 @@
1
+ module Noofakku
2
+
3
+ class Prev
4
+
5
+ def perform(processor, memory, program, input, output)
6
+ raise "processor cannot be nil" unless processor != nil
7
+ processor.data_pointer -= 1
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,27 @@
1
+ module Noofakku
2
+
3
+ class Processor
4
+
5
+ attr_accessor :instruction_pointer, :data_pointer
6
+
7
+ def initialize(instruction_to_handler)
8
+ raise "instruction_to_handler cannot be nil" unless instruction_to_handler != nil
9
+ @instruction_to_handler = instruction_to_handler
10
+ @instruction_pointer = @data_pointer = 0
11
+ end
12
+
13
+ def run(program, memory, input, output)
14
+ raise "program cannot be nil" unless program != nil
15
+ raise "memory cannot be nil" unless memory != nil
16
+ raise "input cannot be nil" unless input != nil
17
+ raise "output cannot be nil" unless output != nil
18
+ while (0...program.length).include? @instruction_pointer
19
+ instruction = @instruction_to_handler[program[@instruction_pointer]]
20
+ instruction.perform(self, memory, program, input, output)
21
+ @instruction_pointer += 1
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ end
data/lib/noofakku.rb CHANGED
@@ -12,16 +12,16 @@ module Noofakku
12
12
  class VM
13
13
  def self.start(program, input, output)
14
14
  processor = Processor.new(Hash.new(Noop.new).merge!({
15
- ">" => Next.new,
16
- "<" => Prev.new,
17
- "+" => Inc.new,
18
- "-" => Dec.new,
19
- "." => Output.new,
20
- "," => Input.new,
21
- "[" => OpenBracket.new("[", "]"),
22
- "]" => ClosedBracket.new("[", "]")
15
+ '>' => Next.new,
16
+ '<' => Prev.new,
17
+ '+' => Inc.new,
18
+ '-' => Dec.new,
19
+ '.' => Output.new,
20
+ ',' => Input.new,
21
+ '[' => OpenBracket.new('[', ']'),
22
+ ']' => ClosedBracket.new('[', ']')
23
23
  }))
24
24
  processor.run(program.clone.freeze, Array.new(30_000, 0), input, output)
25
25
  end
26
26
  end
27
- end
27
+ end
data/noofakku.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'noofakku'
3
+ s.version = `git describe --tags --abbrev=0`.split("\n")[0]
4
+ s.date = '2013-12-08'
5
+ s.summary = "Noofakku"
6
+ s.description = "A simple brainfuck implementation"
7
+ s.authors = ["Mauro Codella"]
8
+ s.email = 'mauro.codella@gmail.com'
9
+ s.homepage = 'http://github.com/mcodella/noofakku'
10
+ s.license = 'MIT'
11
+
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.require_paths = ["lib"]
16
+
17
+ s.add_development_dependency "rake"
18
+ s.add_development_dependency "shoulda"
19
+ s.add_development_dependency "coveralls"
20
+ end
Binary file
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/closed_bracket'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class ClosedBracketTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = ClosedBracket.new("[", "]")
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "throw on nil program" do
25
+ assert_raise (RuntimeError) { @instance.perform(Object.new, Object.new, nil, Object.new, Object.new) }
26
+ end
27
+
28
+ should "throw if instruction pointer is not pointing to an open bracket" do
29
+ spy_processor = OpenStruct.new(instruction_pointer: 0)
30
+ assert_raise (RuntimeError) { @instance.perform(spy_processor, Object.new, "_", nil, nil) }
31
+ end
32
+
33
+ should "leave the instruction pointer as is if data pointer points to a cell which value is zero" do
34
+ spy_processor = OpenStruct.new(instruction_pointer: 2, data_pointer: 0)
35
+ @instance.perform(spy_processor, [0], "[_]_", nil, nil)
36
+ assert_equal 2, spy_processor.instruction_pointer
37
+ end
38
+
39
+ should "change the instruction pointer in order to point to the matching '[' if data pointer points to a cell which value is not zero" do
40
+ spy_processor = OpenStruct.new(instruction_pointer: 2, data_pointer: 0)
41
+ @instance.perform(spy_processor, [42], "[_]_", nil, nil)
42
+ assert_equal 0, spy_processor.instruction_pointer
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/dec'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class DecTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Dec.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "decrement memory cell addressed by the data pointer" do
25
+ spy_processor = OpenStruct.new(data_pointer: 0)
26
+ spy_memory = [0]
27
+ @instance.perform(spy_processor, spy_memory, nil, nil, nil)
28
+ assert_equal -1, spy_memory[spy_processor.data_pointer]
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/inc'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class IncTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Inc.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "increment memory cell addressed by the data pointer" do
25
+ spy_processor = OpenStruct.new(data_pointer: 0)
26
+ spy_memory = [0]
27
+ @instance.perform(spy_processor, spy_memory, nil, nil, nil)
28
+ assert_equal 1, spy_memory[spy_processor.data_pointer]
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
@@ -0,0 +1,40 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/input'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class InputTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Input.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "throw on nil input" do
25
+ assert_raise (RuntimeError) { @instance.perform(Object.new, Object.new, Object.new, nil, Object.new) }
26
+ end
27
+
28
+ should "fill the memory cell addressed by the data pointer with the value of the yielded block" do
29
+ spy_processor = OpenStruct.new(data_pointer: 0)
30
+ spy_memory = [0]
31
+ input = lambda { 42 }
32
+ @instance.perform(spy_processor, spy_memory, nil, input, nil)
33
+ assert_equal 42, spy_memory[spy_processor.data_pointer]
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/next'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class NextTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Next.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, nil, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "increment memory data pointer" do
21
+ spy_processor = OpenStruct.new(data_pointer: 0)
22
+ @instance.perform(spy_processor, nil, nil, nil, nil)
23
+ assert_equal 1, spy_processor.data_pointer
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,66 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/noop'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class NoopTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Noop.new
14
+ end
15
+
16
+ should "leave alone the data pointer" do
17
+ spy_processor = OpenStruct.new(data_pointer: 0)
18
+ @instance.perform(spy_processor, [], [], ->{0}, ->value{})
19
+ assert_equal 0, spy_processor.data_pointer
20
+ end
21
+
22
+ should "leave alone the instruction pointer" do
23
+ spy_processor = OpenStruct.new(instruction_pointer: 0)
24
+ @instance.perform(spy_processor, [], [], ->{0}, ->value{})
25
+ assert_equal 0, spy_processor.instruction_pointer
26
+ end
27
+
28
+ should "leave alone the memory" do
29
+ touched = false
30
+ not_to_be_touched = [].freeze
31
+ begin
32
+ @instance.perform(Object.new, not_to_be_touched, [], ->{0}, ->value{})
33
+ rescue
34
+ touched = true
35
+ end
36
+ assert (not touched)
37
+ end
38
+
39
+ should "leave alone the program" do
40
+ touched = false
41
+ not_to_be_touched = [].freeze
42
+ begin
43
+ @instance.perform(Object.new, [], not_to_be_touched, ->{0}, ->value{})
44
+ rescue
45
+ touched = true
46
+ end
47
+ assert (not touched)
48
+ end
49
+
50
+ should "leave alone the input lambda" do
51
+ invoked = false
52
+ @instance.perform(Object.new, [], [], ->{ invoked = true }, ->value{})
53
+ assert (not invoked)
54
+ end
55
+
56
+ should "leave alone the output lambda" do
57
+ invoked = false
58
+ @instance.perform(Object.new, [], [], ->{}, ->value{ invoked = true })
59
+ assert (not invoked)
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/open_bracket'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class OpenBracketTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = OpenBracket.new("[", "]")
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "throw on nil program" do
25
+ assert_raise (RuntimeError) { @instance.perform(Object.new, Object.new, nil, Object.new, Object.new) }
26
+ end
27
+
28
+ should "throw if instruction pointer is not pointing to an open bracket" do
29
+ spy_processor = OpenStruct.new(instruction_pointer: 0)
30
+ assert_raise (RuntimeError) { @instance.perform(spy_processor, Object.new, "_", nil, nil) }
31
+ end
32
+
33
+ should "leave the instruction pointer as is if data pointer points to a cell which value is not zero" do
34
+ spy_processor = OpenStruct.new(instruction_pointer: 0, data_pointer: 0)
35
+ @instance.perform(spy_processor, [42], "[_]_", nil, nil)
36
+ assert_equal 0, spy_processor.instruction_pointer
37
+ end
38
+
39
+ should "change the instruction pointer in order to point to the matching ']' if data pointer points to a cell which value is zero" do
40
+ spy_processor = OpenStruct.new(instruction_pointer: 0, data_pointer: 0)
41
+ @instance.perform(spy_processor, [0], "[_]_", nil, nil)
42
+ assert_equal 2, spy_processor.instruction_pointer
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+ end
@@ -0,0 +1,38 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/output'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class OutputTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Output.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, Object.new, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "throw on nil memory" do
21
+ assert_raise (RuntimeError) { @instance.perform(Object.new, nil, Object.new, Object.new, Object.new) }
22
+ end
23
+
24
+ should "throw on nil output" do
25
+ assert_raise (RuntimeError) { @instance.perform(Object.new, Object.new, Object.new, Object.new, nil) }
26
+ end
27
+
28
+ should "yield the value of the memory cell addressed by the data pointer" do
29
+ spy_processor = OpenStruct.new(data_pointer: 0)
30
+ output = ->value { assert_equal 42, value }
31
+ @instance.perform(spy_processor, [42], nil, nil, output)
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ require 'noofakku/instruction/prev'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class PrevTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @instance = Prev.new
14
+ end
15
+
16
+ should "throw on nil processor" do
17
+ assert_raise (RuntimeError) { @instance.perform(nil, nil, Object.new, Object.new, Object.new) }
18
+ end
19
+
20
+ should "decrement memory data pointer" do
21
+ spy_processor = OpenStruct.new(data_pointer: 0)
22
+ @instance.perform(spy_processor, nil, nil, nil, nil)
23
+ assert_equal -1, spy_processor.data_pointer
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+ require 'noofakku'
3
+ require 'shoulda'
4
+
5
+ module Noofakku
6
+
7
+ class VMTest < Test::Unit::TestCase
8
+
9
+ context 'Execution' do
10
+
11
+ should 'produce "Hello World" in output' do
12
+ input = -> { 0 }
13
+ produced = ''
14
+ output = ->value { produced << value }
15
+ program = '++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.'
16
+ Noofakku::VM.start(program, input, output)
17
+ assert_equal "Hello World!\n", produced
18
+ end
19
+
20
+ should 'produce Fibonacci numbers in output' do
21
+ program = '+.>+.>>>++++++++++[<<<[->>+<<]>>[-<+<+>>]<<<[->+<]>>[-<<+>>]<.>>>-]'
22
+ input = -> { 0 }
23
+ produced = []
24
+ output = ->value { produced << value }
25
+ Noofakku::VM.start(program, input, output)
26
+ assert_equal [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144], produced
27
+ end
28
+
29
+ should 'order numbers in input' do
30
+ program = '>>,[>>,]<< [[-<+<]>[>[>>]<[.[-]<[[>>+<<-]<]>>]>]<<]'
31
+ to_be_sorted = [5, 3, 2, 6, 0].each
32
+ input = -> { to_be_sorted.next }
33
+ produced = []
34
+ output = ->value { produced << value }
35
+ Noofakku::VM.start(program, input, output)
36
+ assert_equal [2, 3, 5, 6], produced
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,53 @@
1
+ require 'test/unit'
2
+ require 'noofakku/processor'
3
+ require 'shoulda'
4
+ require 'ostruct'
5
+
6
+ module Noofakku
7
+
8
+ class ProcessorTest < Test::Unit::TestCase
9
+
10
+ context "Execution" do
11
+
12
+ setup do
13
+ @spy_instruction = SpyInstruction.new
14
+ @instance = Processor.new({"x" => @spy_instruction})
15
+ end
16
+
17
+ should "throw on nil instruction" do
18
+ assert_raise (RuntimeError) { Processor.new(nil) }
19
+ end
20
+
21
+ should "throw on nil program" do
22
+ assert_raise (RuntimeError) { @instance.run(nil, Object.new, Object.new, Object.new) }
23
+ end
24
+
25
+ should "throw on nil memory" do
26
+ assert_raise (RuntimeError) { @instance.run(Object.new, nil, Object.new, Object.new) }
27
+ end
28
+
29
+ should "throw on nil input" do
30
+ assert_raise (RuntimeError) { @instance.run(Object.new, Object.new, nil, Object.new) }
31
+ end
32
+
33
+ should "throw on nil output" do
34
+ assert_raise (RuntimeError) { @instance.run(Object.new, Object.new, Object.new, nil) }
35
+ end
36
+
37
+ should "invoke instructions" do
38
+ input = -> {}
39
+ output = ->value {}
40
+ @instance.run('x', [], input, output)
41
+ assert @spy_instruction.invoked
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ class SpyInstruction
49
+ attr_reader :invoked
50
+ def perform(processor, memory, program, input, output); @invoked = true; end
51
+ end
52
+
53
+ end
@@ -0,0 +1,3 @@
1
+ require 'coveralls'
2
+
3
+ Coveralls.wear!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noofakku
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauro Codella
@@ -9,14 +9,86 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2013-12-08 00:00:00.000000000 Z
12
- dependencies: []
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: shoulda
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coveralls
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  description: A simple brainfuck implementation
14
56
  email: mauro.codella@gmail.com
15
57
  executables: []
16
58
  extensions: []
17
59
  extra_rdoc_files: []
18
60
  files:
61
+ - .gitignore
62
+ - .travis.yml
63
+ - Gemfile
64
+ - Gemfile.lock
65
+ - README.md
66
+ - Rakefile
19
67
  - lib/noofakku.rb
68
+ - lib/noofakku/instruction/closed_bracket.rb
69
+ - lib/noofakku/instruction/dec.rb
70
+ - lib/noofakku/instruction/inc.rb
71
+ - lib/noofakku/instruction/input.rb
72
+ - lib/noofakku/instruction/next.rb
73
+ - lib/noofakku/instruction/noop.rb
74
+ - lib/noofakku/instruction/open_bracket.rb
75
+ - lib/noofakku/instruction/output.rb
76
+ - lib/noofakku/instruction/prev.rb
77
+ - lib/noofakku/processor.rb
78
+ - noofakku.gemspec
79
+ - resources/icon.png
80
+ - test/instruction/closed_bracket_test.rb
81
+ - test/instruction/dec_test.rb
82
+ - test/instruction/inc_test.rb
83
+ - test/instruction/input_test.rb
84
+ - test/instruction/next_test.rb
85
+ - test/instruction/noop_test.rb
86
+ - test/instruction/open_bracket_test.rb
87
+ - test/instruction/output_test.rb
88
+ - test/instruction/prev_test.rb
89
+ - test/noofakku_smoke_test.rb
90
+ - test/processor_test.rb
91
+ - test/test_helper.rb
20
92
  homepage: http://github.com/mcodella/noofakku
21
93
  licenses:
22
94
  - MIT