package wallet import ( "fmt" "testing" ) func ExampleWallet() { wallet := Wallet{10} wallet.Deposit(10) fmt.Printf("The balance is %s\n", wallet.Balance()) err := wallet.Withdraw(10) if err != nil { fmt.Println(err) } fmt.Printf("The balance is %s\n", wallet.Balance()) // Output: The balance is 20 BTC // The balance is 10 BTC } func TestWallet(t *testing.T) { t.Run("deposit", func(t *testing.T) { wallet := Wallet{} wallet.Deposit(10) assertBalance(t, wallet, Bitcoin(10)) }) t.Run("withdraw", func(t *testing.T) { wallet := Wallet{balance: Bitcoin(20)} err := wallet.Withdraw(10) assertNoError(t, err) assertBalance(t, wallet, Bitcoin(10)) }) t.Run("withdraw insufficient funds", func(t *testing.T) { startingBalance := Bitcoin(20) wallet := Wallet{balance: startingBalance} err := wallet.Withdraw(100) assertError(t, err, ErrInsufficientFunds) assertBalance(t, wallet, startingBalance) }) } func assertBalance(t testing.TB, wallet Wallet, want Bitcoin) { t.Helper() got := wallet.Balance() if got != want { t.Errorf("got %q, want %q", got, want) } } func assertError(t testing.TB, got error, want error) { t.Helper() if got == nil { t.Fatal("didn't get an error but wanted one") } if got != want { t.Errorf("got %q, want %q", got, want) } } func assertNoError(t testing.TB, got error) { t.Helper() if got != nil { t.Fatal("get an error but didn't want one") } }