package examples

import "testing"

func TestMoneyRejectsInvalidValues(t *testing.T) {
	for _, input := range []struct {
		cents    int64
		currency string
	}{
		{
			cents:    -1,
			currency: "CNY",
		},
		{
			cents:    100,
			currency: "",
		},
	} {
		if _, err := NewMoney(input.cents, input.currency); err == nil {
			t.Fatal("invalid money was accepted")
		}
	}
}

func TestZeroAmountIsValid(t *testing.T) {
	money, err := NewMoney(0, "CNY")
	if err != nil {
		t.Fatal(err)
	}
	if money.cents != 0 || money.currency != "CNY" {
		t.Fatal("valid value was changed")
	}
}

func TestShippedOrderCannotBeCanceled(t *testing.T) {
	order := Order{status: "SHIPPED"}
	if err := order.Cancel(); err == nil {
		t.Fatal("shipped order was canceled")
	}
	if order.status != "SHIPPED" {
		t.Fatal("rejected command changed state")
	}
}

func TestCancelCanBeRepeated(t *testing.T) {
	order := Order{status: "PLACED"}
	for range 2 {
		if err := order.Cancel(); err != nil {
			t.Fatal(err)
		}
	}
	if order.status != "CANCELED" {
		t.Fatal("order did not reach canceled state")
	}
}
