You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.5 KiB
117 lines
2.5 KiB
5 years ago
|
require 'minitest/autorun'
|
||
|
|
||
|
class Tree
|
||
|
include Enumerable
|
||
|
|
||
|
attr_accessor :children, :node_name
|
||
|
def initialize(name, children=[]) @children = children
|
||
|
@node_name = name
|
||
|
end
|
||
|
def visit_all(&block)
|
||
|
visit(&block)
|
||
|
children.each {|c| c.visit_all(&block)}
|
||
|
end
|
||
|
|
||
|
alias :each :visit_all
|
||
|
def visit(&block)
|
||
|
block.call self
|
||
|
end
|
||
|
|
||
|
def self.build(hash)
|
||
|
hash.map {|name, children|
|
||
|
Tree.new(name, self.build(children))
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Hash
|
||
|
def to_tree
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'day 2' do
|
||
|
it 'opens files' do
|
||
|
File.open 'README.md' do |file|
|
||
|
# This will close when done
|
||
|
expect(file.each_line.first).wont_be_nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'converts hashes to arrays' do
|
||
|
person = {name: 'Alice', age: 42, country: 'US'}
|
||
|
expect(person.to_a).must_equal [
|
||
|
[:name, 'Alice'],
|
||
|
[:age, 42],
|
||
|
[:country, 'US'],
|
||
|
]
|
||
|
end
|
||
|
|
||
|
it 'converts arrays to hashes' do
|
||
|
car = [[:make, 'Ford'], [:model, 'Pinto'], [:top_speed, 35]]
|
||
|
expect(car.to_h).must_equal ({
|
||
|
make: 'Ford',
|
||
|
model: 'Pinto',
|
||
|
top_speed: 35,
|
||
|
})
|
||
|
end
|
||
|
|
||
|
it 'iterates through hashes' do
|
||
|
pokemon = {name: 'Pikachu', type: 'Electric', weight: 13.2}
|
||
|
pokemon.each do |key, value|
|
||
|
expect(pokemon[key]).must_equal value
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'has stack-like arrays' do
|
||
|
stack = []
|
||
|
stack << 1 << 2 << 3
|
||
|
expect(stack.pop).must_equal 3
|
||
|
expect(stack.pop).must_equal 2
|
||
|
expect(stack.pop).must_equal 1
|
||
|
end
|
||
|
|
||
|
it 'has queue-like arrays' do
|
||
|
stack = []
|
||
|
stack << 1 << 2 << 3
|
||
|
expect(stack.shift).must_equal 1
|
||
|
expect(stack.shift).must_equal 2
|
||
|
expect(stack.shift).must_equal 3
|
||
|
end
|
||
|
|
||
|
it 'has lookup arrays' do
|
||
|
lookup = []
|
||
|
lookup << [:yogurt, :dairy] << [:carrot, :veggie] << [:tomato, :fruit]
|
||
|
expect(lookup.assoc(:yogurt)).must_equal [:yogurt, :dairy]
|
||
|
expect(lookup.assoc(:tomato)).must_equal [:tomato, :fruit]
|
||
|
lookup.unshift [:tomato, :veggie]
|
||
|
expect(lookup.assoc(:tomato)).must_equal [:tomato, :veggie]
|
||
|
end
|
||
|
|
||
|
it 'handles contents of 16 numbers' do
|
||
|
numbers = (0...16).to_a
|
||
|
numbers.each_slice(4) do |nums|
|
||
|
expect(nums.length).must_equal 4
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'makes a tree' do
|
||
|
|
||
|
tree = Tree.build(
|
||
|
'grandpa' => {
|
||
|
'dad' => {
|
||
|
'child 1' => {},
|
||
|
'child 2' => {}
|
||
|
},
|
||
|
'uncle' => {
|
||
|
'child 3' => {},
|
||
|
'child 4' => {}
|
||
|
}
|
||
|
}
|
||
|
).first
|
||
|
|
||
|
expect(tree.map &:node_name).must_equal ['grandpa', 'dad', 'child 1', 'child 2', 'uncle', 'child 3', 'child 4']
|
||
|
end
|
||
|
|
||
|
|
||
|
end
|