Last active
August 20, 2020 22:46
-
-
Save dearshrewdwit/a9025f71968b810e1c87f1b0df728b58 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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