From 376a3371d948a35fd51f7b9ea36545d1760f9f2a Mon Sep 17 00:00:00 2001 From: giangduong36 Date: Wed, 7 Mar 2018 01:26:22 -0600 Subject: [PATCH 1/4] Part 1 done? --- lib/retail_transaction.rb | 5 +++++ test/retail_transaction_test.rb | 25 +++++++++++++++++++++++++ test/test_helper.rb | 4 ++-- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/lib/retail_transaction.rb b/lib/retail_transaction.rb index 1bfa0e3..545e1f0 100644 --- a/lib/retail_transaction.rb +++ b/lib/retail_transaction.rb @@ -39,6 +39,7 @@ def paid? state :processing_payment state :payment_declined state :settled + state :refunded event :check_out do transitions from: :ringing_up, to: :collecting_payment, @@ -61,5 +62,9 @@ def paid? event :payment_declined do transitions from: :processing_payment, to: :payment_declined end + + event :refund do + transitions from: :settled, to: :refunded + end end end diff --git a/test/retail_transaction_test.rb b/test/retail_transaction_test.rb index 823cbfe..c4b6c03 100644 --- a/test/retail_transaction_test.rb +++ b/test/retail_transaction_test.rb @@ -103,6 +103,10 @@ assert_equal false, tx.settled? assert_equal true, tx.payment_declined? end + + it "cannot be refunded" do + assert_invalid_transition{tx.refund!} + end end describe "with declined payment" do @@ -138,6 +142,11 @@ assert_equal false, tx.payment_declined? assert_equal true, tx.processing_payment? end + + it "cannot be refunded" do + assert_invalid_transition{tx.refund!} + end + end describe "that is settled" do @@ -152,5 +161,21 @@ it "cannot be reopened" do assert_invalid_transition { tx.reopen! } end + + it "can be refunded" do + tx.refund! + assert_equal false, tx.settled? + assert_equal true, tx.refunded? + end + end + + describe "refunded" do + it "cannot be refunded a second time" do + assert_invalid_transition { tx.refund! } + end + + it "cannot be reopened" do + assert_invalid_transition { tx.refund! } + end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index a343433..383ebf7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -8,8 +8,8 @@ # To see full test names when running tests: # -# require "minitest/reporters" -# Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new +require "minitest/reporters" +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new module Minitest::Assertions def assert_invalid_transition From 23c4766ddc43f0773736477fe4f77ce954213035 Mon Sep 17 00:00:00 2001 From: giangduong36 Date: Wed, 7 Mar 2018 02:02:28 -0600 Subject: [PATCH 2/4] Part 2 Making progress --- lib/desugaring.rb | 54 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/desugaring.rb b/lib/desugaring.rb index 8d52908..0c698d4 100644 --- a/lib/desugaring.rb +++ b/lib/desugaring.rb @@ -21,7 +21,10 @@ def all_the_sugar(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # def desugared_poetry(recipients, event, message) - implement_me! + mail(message, + to: recipients.map(&:email), + subject: "You’re invited to #{event.title} on #{event.date}" + ) end # Ruby allows you to pass arguments identified by name instead of just by position. They are really just @@ -36,7 +39,10 @@ def desugared_poetry(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # def desugared_named_args(recipients, event, message) - implement_me! + mail(message, + {to: recipients.map(&:email), + subject: "You’re invited to #{event.title} on #{event.date}"} + ) end # Ruby’s general syntax for hashes is `{key => value, key => value, ...}`. Because it is so common to use @@ -51,7 +57,10 @@ def desugared_named_args(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # def desugared_symbol_keys(recipients, event, message) - implement_me! + mail(message, + {:to => recipients.map(&:email), + :subject => "You’re invited to #{event.title} on #{event.date}"} + ) end # You may be wondering how `map(&:email)` works. When you precede the last argument of a method call with @@ -70,7 +79,10 @@ def desugared_symbol_keys(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # def desugared_attr_proc(recipients, event, message) - implement_me! + mail(message, + {:to => recipients.map{ |x| x.email}, + :subject => "You’re invited to #{event.title} on #{event.date}"} + ) end # You may recall from the Ruby koans that when you put `#{something}` in a `"`-delimited string, Ruby will @@ -88,9 +100,14 @@ def desugared_attr_proc(recipients, event, message) # Copy the contents of the previous method here and remove this sugar. # def desugared_interpolation(recipients, event, message) - implement_me! + mail(message, + {:to => recipients.map{ |x| x.email}, + :subject => "You’re invited to " + event.title.to_s + " on " + event.date.to_s} + ) end + # :subject => "You’re invited to #{event.title} on #{event.date}"} + # Ruby tracks local variables lexically at compile time. Wherever you say `x = y`, the compiler assumes that # `x` is a local variable, and implicitly declares it if it’s not already declared. You also create a local # variable when you make a method parameter or block parameter. @@ -110,7 +127,10 @@ def desugared_interpolation(recipients, event, message) # (Think: which names are local variables, and which are not?) # def desugared_implicit_self(recipients, event, message) - implement_me! + self.mail(message, + {:to => recipients.map{ |x| x.email}, + :subject => "You’re invited to " + event.title.to_s + " on " + event.date.to_s} + ) end # In Ruby, unlike Python, there are no properties distinct from method calls. When you say `x.y`, you are @@ -131,7 +151,10 @@ def desugared_implicit_self(recipients, event, message) # but structurally quite similar! # def desugared_implicit_parens(recipients, event, message) - implement_me! + self.mail(message, + {:to => recipients.map(){ |x| x.email()}, + :subject => "You’re invited to " + event.title().to_s() + " on " + event.date().to_s()} + ) end # In Ruby, every value is an object and every action is a method call. That includes operators. A binary @@ -153,7 +176,22 @@ def desugared_implicit_parens(recipients, event, message) # get added before the things on the right. (a + b + c) means ((a + b) + c), NOT (a + (b + c)). # def desugared_operators(recipients, event, message) - implement_me! + self.mail(message, + {:to=>recipients.map(){|x| x.email()}, + :subject => + ( + ( + ( + "You’re invited to ".+(event.title().to_s()) + ).+( + " on " + ) + ).+( + event.date().to_s() + ) + ) + } + ) end # Compare that to the version at the top. From 65f9964ead168be8b270dcba6f1bb7f324354f84 Mon Sep 17 00:00:00 2001 From: giangduong36 Date: Thu, 8 Mar 2018 17:24:04 -0500 Subject: [PATCH 3/4] HW Bonus Done? --- lib/desugaring.rb | 7 +++++-- lib/door.rb | 35 +++++++++++---------------------- test/retail_transaction_test.rb | 13 ++++++++++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/lib/desugaring.rb b/lib/desugaring.rb index 0c698d4..1f9d255 100644 --- a/lib/desugaring.rb +++ b/lib/desugaring.rb @@ -177,7 +177,7 @@ def desugared_implicit_parens(recipients, event, message) # def desugared_operators(recipients, event, message) self.mail(message, - {:to=>recipients.map(){|x| x.email()}, + {:to => recipients.map(){|x| x.email()}, :subject => ( ( @@ -187,13 +187,16 @@ def desugared_operators(recipients, event, message) " on " ) ).+( - event.date().to_s() + event.date().to_s() ) ) + } ) end + # =>, block {}, space in string, |x| + # Compare that to the version at the top. # # Languages designers argue a lot -- excessively, perhaps -- about how much sugar is too much. diff --git a/lib/door.rb b/lib/door.rb index 0f99a74..8d9c534 100644 --- a/lib/door.rb +++ b/lib/door.rb @@ -16,29 +16,18 @@ class Door end end - aasm :deadbolt_lock, namespace: :deadbolt do - state :unlocked, initial: true - state :locked - - event :lock_deadbolt do - transitions to: :locked - end - - event :unlock_deadbolt do - transitions to: :unlocked - end - end - - aasm :knob_lock, namespace: :knob do - state :unlocked, initial: true - state :locked - - event :lock_knob do - transitions to: :locked - end - - event :unlock_knob do - transitions to: :unlocked + for i in ["deadbolt", "knob"] + aasm (i + "_lock").to_sym, namespace: i.to_sym do + state :unlocked, initial: true + state :locked + + event "lock_".concat(i).to_sym do + transitions to: :locked + end + + event "unlock_".concat(i).to_sym do + transitions to: :unlocked + end end end end diff --git a/test/retail_transaction_test.rb b/test/retail_transaction_test.rb index c4b6c03..0cadd83 100644 --- a/test/retail_transaction_test.rb +++ b/test/retail_transaction_test.rb @@ -169,13 +169,22 @@ end end - describe "refunded" do + describe "that is refunded" do + before(:each) do + tx.add_item("bobcat") + tx.check_out! + tx.payment_info = "15 cents and a nail" + tx.process_payment! + tx.payment_authorized! + tx.refund! + end + it "cannot be refunded a second time" do assert_invalid_transition { tx.refund! } end it "cannot be reopened" do - assert_invalid_transition { tx.refund! } + assert_invalid_transition { tx.reopen! } end end end From 6f44a2fedb81f0621f3c2e555ec5f9e1ced47a4f Mon Sep 17 00:00:00 2001 From: giangduong36 Date: Thu, 8 Mar 2018 17:37:35 -0500 Subject: [PATCH 4/4] Delete white space desugared --- lib/desugaring.rb | 4 ++-- test/retail_transaction_test.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/desugaring.rb b/lib/desugaring.rb index 1f9d255..bd9f05e 100644 --- a/lib/desugaring.rb +++ b/lib/desugaring.rb @@ -177,8 +177,8 @@ def desugared_implicit_parens(recipients, event, message) # def desugared_operators(recipients, event, message) self.mail(message, - {:to => recipients.map(){|x| x.email()}, - :subject => + {:to=>recipients.map(){|x|x.email()}, + :subject=> ( ( ( diff --git a/test/retail_transaction_test.rb b/test/retail_transaction_test.rb index 0cadd83..61eb9bb 100644 --- a/test/retail_transaction_test.rb +++ b/test/retail_transaction_test.rb @@ -179,6 +179,7 @@ tx.refund! end + it "cannot be refunded a second time" do assert_invalid_transition { tx.refund! } end