Skip to content

Instantly share code, notes, and snippets.

@dydx
Created March 28, 2010 21:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dydx/347046 to your computer and use it in GitHub Desktop.
Save dydx/347046 to your computer and use it in GitHub Desktop.
# number_parser.rb - Josh Sandlin - 2:03PM 3/28/2010
# translating some Java ideas over to Ruby code.
require 'test/unit'
class Node
def evaluate; end
end
class ValueNode < Node
attr_accessor :value
def initialize( value )
@value = value
end
def evaluate
@value
end
end
class OpNode < Node
attr_accessor :left, :right
def initialize
@left = Node.new
@right = Node.new
end
def evaluate; end
end
class AdditionNode < OpNode
def initialize( left, right )
@left, @right = left, right
end
def evaluate
left.evaluate + right.evaluate
end
end
class MultiplicationNode < OpNode
def initialize( left, right )
@left, @right = left, right
end
def evaluate
left.evaluate * right.evaluate
end
end
# unit tests
class ExpressionTreeTest < Test::Unit::TestCase
def test_addition
assert_equal 5, AdditionNode.new( ValueNode.new( 3 ),
ValueNode.new( 2 ) ).evaluate
assert_equal 4, AdditionNode.new( ValueNode.new( 2 ),
ValueNode.new( 2 ) ).evaluate
assert_equal 1, AdditionNode.new( ValueNode.new( 1 ),
ValueNode.new( 0 ) ).evaluate
end
def test_multiplication
assert_equal 6, MultiplicationNode.new( ValueNode.new( 2 ),
ValueNode.new( 3 ) ).evaluate
assert_equal 2, MultiplicationNode.new( ValueNode.new( 2 ),
ValueNode.new( 1 ) ).evaluate
assert_equal 9, MultiplicationNode.new( ValueNode.new( 3 ),
ValueNode.new( 3 ) ).evaluate
end
def test_mixed_operations
assert_equal 7, AdditionNode.new( ValueNode.new( 1 ),
MultiplicationNode.new( ValueNode.new( 2 ),
ValueNode.new( 3 ) ) ).evaluate
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment