Skip to content

Instantly share code, notes, and snippets.

@dearshrewdwit
Last active August 20, 2020 22:46
Show Gist options
  • Select an option

  • Save dearshrewdwit/a9025f71968b810e1c87f1b0df728b58 to your computer and use it in GitHub Desktop.

Select an option

Save dearshrewdwit/a9025f71968b810e1c87f1b0df728b58 to your computer and use it in GitHub Desktop.
# NB: this example uses a test-framework called m-spec
# https://github.com/dearshrewdwit/m-spec
# Follow along with the screen recording here: https://youtu.be/c5dg-LPQp2E
# ---------------------------------------------------------------------------
# ./lib/todo_list.rb
require_relative "todo.rb"
class TodoList
def initialize
@todos = []
end
def add(description, todo_class = Todo)
@todos << todo_class.new(description)
end
def get(index)
all[index]
end
def set_complete(index)
get(index).complete
end
def to_string
all.map.with_index do |todo, index|
"#{index + 1}. #{todo.to_string}"
end.join("\n")
end
private
def all
@todos
end
end
# ---------------------------------------------------------------------------
# ./lib/todo.rb
class Todo
STATUSES = {
true => 'complete',
false => 'not complete'
}
attr_reader :description, :status
def initialize(description)
@description = description
@status = false
end
def complete
@status = true
end
def to_string
"#{description} #{STATUSES[status]}"
end
end
# ---------------------------------------------------------------------------
# ./spec/feature_spec.rb
require "./lib/todo_list.rb"
describe "TodoList features" do
it "can create a todo" do
list = TodoList.new
list.add("say hi")
expect(list.to_string).to eq("1. say hi not complete")
end
it "can complete a todo" do
list = TodoList.new
list.add("say hi")
list.set_complete(0)
expect(list.to_string).to eq("1. say hi complete")
end
it "can print some todos" do
list = TodoList.new
list.add("say hi")
list.add("say howdy")
expect(list.to_string)
.to eq("1. say hi not complete\n2. say howdy not complete")
end
end
# ---------------------------------------------------------------------------
# ./spec/todo_list_spec.rb
require "./lib/todo_list.rb"
describe TodoList do
describe "creation" do
it "creates a list with no todos" do
todo_list = TodoList.new
expect(todo_list.get(0)).to eq nil
end
end
describe "adding a todo" do
it "stores a todo with a description" do
todo = test_double('a todo')
todo_class = test_double('todo_class')
allow(todo_class).to receive(:new) { todo }
todo_list = TodoList.new
result = todo_list.add("say hi", todo_class)
expect(result).to eq [todo]
end
end
describe "getting a todo" do
it "gets a todo at an index" do
todo = test_double('a todo')
todo_class = test_double('todo_class')
allow(todo_class).to receive(:new) { todo }
todo_list = TodoList.new
todo_list.add("say hi", todo_class)
expect(todo_list.get(0)).to eq todo
end
end
describe 'a list of todos' do
it 'a string of todos with index' do
todo = test_double('a todo')
allow(todo).to receive(:to_string) { 'say hi not complete' }
todo_class = test_double('todo_class')
allow(todo_class).to receive(:new) { todo }
todo_list = TodoList.new
todo_list.add("say hi", todo_class)
expect(todo_list.to_string).to eq "1. say hi not complete"
end
it 'lots of strings of todos with index' do
todo = test_double('a todo')
allow(todo).to receive(:to_string) { 'say hi not complete' }
todo_class = test_double('todo_class')
allow(todo_class).to receive(:new) { todo }
todo_list = TodoList.new
todo_list.add("say hi", todo_class)
todo_list.add("say hi", todo_class)
expect(todo_list.to_string).to eq "1. say hi not complete\n2. say hi not complete"
end
end
describe '#set_complete' do
it 'asks a todo to be complete' do
todo = test_double('a todo')
allow(todo).to receive(:complete) { true }
todo_class = test_double('todo_class')
allow(todo_class).to receive(:new) { todo }
todo_list = TodoList.new
todo_list.add("say hi", todo_class)
expect(todo_list.set_complete(0)).to eq true
end
end
end
# ---------------------------------------------------------------------------
# ./spec/todo_spec.rb
require "./lib/todo.rb"
describe 'Todo' do
describe "creation" do
it "creates a todo" do
todo = Todo.new("say hi")
expect(todo.class).to eq Todo
end
end
describe '#description' do
it 'returns description' do
todo = Todo.new("say hi")
expect(todo.description).to eq "say hi"
end
end
describe '#state' do
it 'returns status' do
todo = Todo.new("say hi")
expect(todo.status).to eq false
end
end
describe '#complete' do
it 'sets status to true' do
todo = Todo.new("say hi")
todo.complete
expect(todo.status).to eq true
end
end
describe '#to_string' do
it 'returns string when not complete' do
todo = Todo.new("say hi")
expect(todo.to_string).to eq "say hi not complete"
end
it 'returns string when complete' do
todo = Todo.new("say hi")
todo.complete
expect(todo.to_string).to eq "say hi complete"
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment