Skip to content

Instantly share code, notes, and snippets.

@loganhasson
Last active December 25, 2015 02:09
Show Gist options
  • Save loganhasson/6900735 to your computer and use it in GitHub Desktop.
Save loganhasson/6900735 to your computer and use it in GitHub Desktop.
class TriangleError < StandardError
end
class Triangle
attr_accessor :a, :b, :c
def initialize(a, b, c)
@a = a
@b = b
@c = c
end
def kind
sides = [a,b,c]
ineq = [a+b > c, a+c > b, b+c > a]
if sides.min <= 0 || ineq.include?(false)
raise TriangleError
end
if a == b && b == c
:equilateral
elsif a != b && a != c && b != c
:scalene
elsif (a == b && b != c) || (b == c && c != a) || (a == c && c != b)
:isosceles
end
end
end
require_relative './triangle.rb'
RSpec.configure do |config|
# Use color in STDOUT
config.color_enabled = true
# Use color not only in STDOUT but also in pagers and files
config.tty = true
# Use the specified formatter
config.formatter = :progress # :progress, :html, :textmate
end
describe 'Triangle' do
it 'knows that equilateral triangles have equal sides' do
Triangle.new(2, 2, 2).kind.should eq(:equilateral)
end
it 'knows that larger equilateral triangles also have equal sides' do
Triangle.new(10, 10, 10).kind.should eq(:equilateral)
end
it 'knows that isosceles triangles have last two sides equal' do
Triangle.new(3, 4, 4).kind.should eq(:isosceles)
end
it 'knows that isosceles triangles have first and last sides equal' do
Triangle.new(4, 3, 4).kind.should eq(:isosceles)
end
it 'knows that isosceles triangles have two first sides equal' do
Triangle.new(4, 4, 3).kind.should eq(:isosceles)
end
it 'knows that isosceles triangles have in fact exactly two sides equal' do
Triangle.new(10, 10, 2).kind.should eq(:isosceles)
end
it 'knows that scalene triangles have no equal sides' do
Triangle.new(3, 4, 5).kind.should eq(:scalene)
end
it 'knows that scalene triangles have no equal sides at a larger scale too' do
Triangle.new(10, 11, 12).kind.should eq(:scalene)
end
it 'knows that scalene triangles have no equal sides in descending order either' do
Triangle.new(5, 4, 2).kind.should eq(:scalene)
end
it 'knows that very small triangles are legal' do
Triangle.new(0.4, 0.6, 0.3).kind.should eq(:scalene)
end
# Bonus Tests
it 'knows that triangles with no size are illegal' do
expect{Triangle.new(0, 0, 0).kind}.to raise_error(TriangleError)
end
it 'knows that triangles with negative sides are illegal' do
expect{Triangle.new(3, 4, -5).kind}.to raise_error(TriangleError)
end
it 'knows that triangles violating triangle inequality are illegal' do
expect{Triangle.new(1, 1, 3).kind}.to raise_error(TriangleError)
end
it 'knows that triangles violating triangle inequality are illegal 2' do
expect{Triangle.new(2, 4, 2).kind}.to raise_error(TriangleError)
end
it 'knows that triangles violating triangle inequality are illegal 3' do
expect{Triangle.new(7, 3, 2).kind}.to raise_error(TriangleError)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment