# Copyright (C) 2024 Manuel Bustillo require 'rails_helper' module Tree RSpec.describe TreeNode do describe '#distance_to_common_ancestor' do def assert_distance(node_1, node_2, distance) aggregate_failures do expect(node_1.distance_to_common_ancestor(node_2)).to eq(distance) expect(node_2.distance_to_common_ancestor(node_1)).to eq(distance) end end context 'when the two nodes are the same' do it 'returns 0 when comparing the root itself' do root = Tree::TreeNode.new('root') assert_distance(root, root, 0) end it 'returns 0 when comparing a child to itself' do root = Tree::TreeNode.new('root') child = root << Tree::TreeNode.new('child') assert_distance(child, child, 0) end end context 'when the two nodes are siblings' do it 'returns 1 when comparing siblings' do root = Tree::TreeNode.new('root') child1 = root << Tree::TreeNode.new('child1') child2 = root << Tree::TreeNode.new('child2') assert_distance(child1, child2, 1) end end context 'when one node is parent of the other' do it 'returns 1 when comparing parent to child' do root = Tree::TreeNode.new('root') child = root << Tree::TreeNode.new('child') assert_distance(root, child, 1) end end context 'when one node is grandparent of the other' do it 'returns 2 when comparing grandparent to grandchild' do root = Tree::TreeNode.new('root') child = root << Tree::TreeNode.new('child') grandchild = child << Tree::TreeNode.new('grandchild') assert_distance(root, grandchild, 2) end end context 'when the two nodes are cousins' do it 'returns 2 when comparing cousins' do root = Tree::TreeNode.new('root') child1 = root << Tree::TreeNode.new('child1') child2 = root << Tree::TreeNode.new('child2') grandchild1 = child1 << Tree::TreeNode.new('grandchild1') grandchild2 = child2 << Tree::TreeNode.new('grandchild2') assert_distance(grandchild1, grandchild2, 2) end end context 'when the two nodes are not related' do it 'returns nil' do root = Tree::TreeNode.new('root') another_root = Tree::TreeNode.new('another_root') assert_distance(root, another_root, nil) end end end end end