aboutsummaryrefslogtreecommitdiff
path: root/internal/player/hardening_removeitem_test.go
blob: b891d4e47dbd23d4d4cbfff5d849244f1ba66b5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package player

import "testing"

// TestRemoveItemRejectsNonPositive: a non-positive quantity must never mutate
// a stack; a negative value used to increase it.
func TestRemoveItemRejectsNonPositive(t *testing.T) {
	p := New("alice")
	p.SetInvSlot(0, &InventorySlot{ItemID: "coin", Quantity: 5})

	if p.RemoveItem("coin", -3) {
		t.Fatal("negative quantity accepted")
	}
	if slot := p.InvSlot(0); slot == nil || slot.Quantity != 5 {
		t.Fatalf("stack mutated by a negative removal: %+v", slot)
	}
	if p.RemoveItem("coin", 0) {
		t.Fatal("zero quantity accepted")
	}
	if slot := p.InvSlot(0); slot == nil || slot.Quantity != 5 {
		t.Fatalf("stack mutated by a zero removal: %+v", slot)
	}
}

// Regression: RemoveItem used to drain every stack and only then return false,
// so a caller that rolled back on failure lost the items anyway.
func TestRemoveItemIsAllOrNothing(t *testing.T) {
	p := New("alice")
	p.SetInvSlot(0, &InventorySlot{ItemID: "coin", Quantity: 2})
	p.SetInvSlot(1, &InventorySlot{ItemID: "coin", Quantity: 3})
	if p.RemoveItem("coin", 10) {
		t.Fatal("removal of more than held reported success")
	}
	if got := p.CountItem("coin"); got != 5 {
		t.Fatalf("failed removal drained stacks: count = %d, want 5", got)
	}
}