annotate Modules/UnitTests.lua @ 82:e9f7bc9199ca release 2010-08-05

Fixed Bug 23 - When you purchase multiple stacks of the same item and it is one you have not invested in yet, ItemAuditor mistakenly counted items you have not yet pulled from the mail as items you already owned. This resulted in those items being counted twice.
author Asa Ayers <Asa.Ayers@Gmail.com>
date Thu, 05 Aug 2010 22:20:44 -0700
parents 4ae431c98059
children
rev   line source
Asa@66 1 --@debug@
Asa@66 2 local ItemAuditor = select(2, ...)
Asa@66 3 local Utils= ItemAuditor:GetModule("Utils")
Asa@66 4
Asa@66 5 local function assertTable(tblA, tblB, msg)
Asa@66 6 for key, value in pairs(tblA) do
Asa@66 7 assert(tblA[key] == tblB[key], msg)
Asa@66 8 end
Asa@66 9 for key, value in pairs(tblB) do
Asa@66 10 assert(tblA[key] == tblB[key], msg)
Asa@66 11 end
Asa@66 12 end
Asa@66 13
Asa@66 14 local UnitTests = {};
Asa@66 15 local backups = {}
Asa@66 16
Asa@66 17 local FROSTWEAVE = "\124cffffffff\124Hitem:33470:0:0:0:0:0:0:0:0\124h[Frostweave Cloth]\124h\124r"
Asa@66 18 local RUNECLOTH = "\124cffffffff\124Hitem:14047:0:0:0:0:0:0:0:0\124h[Runecloth]\124h\124r"
Asa@66 19 local BOLT_FW = "\124cffffd000\124Henchant:55899\124h[Tailoring: Bolt of Frostweave]\124h\124r"
Asa@66 20
Asa@66 21 local fakeBags = {
Asa@66 22 [0] = {
Asa@66 23 size = 16,
Asa@66 24 contents = {
Asa@66 25 [0] = nil,
Asa@66 26 [1] = {link = FROSTWEAVE, count=10},
Asa@66 27 }
Asa@66 28 },
Asa@66 29 [1] = {
Asa@66 30 size = 8,
Asa@66 31 contents = {
Asa@66 32 [0] = {link = RUNECLOTH, count=20},
Asa@66 33 }
Asa@66 34 },
Asa@66 35 }
Asa@66 36
Asa@66 37 local fakeMoney = 314159265
Asa@66 38
Asa@66 39 local fakeAlts = {
Asa@66 40 [33470] = 10, -- Frostweave
Asa@66 41 }
Asa@66 42
Asa@66 43
Asa@66 44 UnitTests.Utils = {
Asa@66 45 mocks = {
Asa@66 46 };
Asa@66 47 setUp = function()
Asa@66 48 return {};
Asa@66 49 end;
Asa@66 50 tearDown = function()
Asa@66 51 end;
Asa@66 52
Asa@66 53 testGetItemID = function()
Asa@66 54 local id = Utils.GetItemID(FROSTWEAVE)
Asa@66 55 assert(id == 33470)
Asa@66 56
Asa@66 57 -- This test doesn't work yet.
Asa@66 58 -- local id = Utils:GetItemID('invalid link')
Asa@66 59 -- assert(id == nil)
Asa@66 60 end;
Asa@66 61
Asa@66 62 testGetIDFromLink = function()
Asa@66 63 -- This should be moved to Utils
Asa@66 64 local id = ItemAuditor:GetIDFromLink(FROSTWEAVE)
Asa@66 65 assert(id == 33470)
Asa@66 66 end;
Asa@66 67
Asa@66 68 testGetSafeLink = function()
Asa@66 69 -- This should be moved to Utils
Asa@66 70 local link = ItemAuditor:GetSafeLink(FROSTWEAVE)
Asa@66 71 assert(link == 'item:33470')
Asa@66 72 end;
Asa@66 73 }
Asa@66 74
Asa@66 75 UnitTests.Core = {
Asa@66 76 mocks = {
Asa@66 77 NUM_BAG_SLOTS = 1;
Asa@66 78 GetContainerNumSlots = function(bagID)
Asa@66 79 return (fakeBags[bagID] and fakeBags[bagID].size) or 0
Asa@66 80 end;
Asa@66 81 GetContainerItemLink = function(bagID, slotID)
Asa@66 82 return fakeBags[bagID] and fakeBags[bagID].contents[slotID] and fakeBags[bagID].contents[slotID].link
Asa@66 83 end;
Asa@66 84 GetMoney = function()
Asa@66 85 return fakeMoney
Asa@66 86 end;
Asa@66 87 GetItemCount = function(link)
Asa@66 88 local total = 0
Asa@66 89 local id = tonumber(link) or ItemAuditor:GetIDFromLink(link)
Asa@66 90
Asa@66 91 for bagID, bag in pairs(fakeBags) do
Asa@66 92 for slotID, contents in pairs(bag.contents) do
Asa@66 93 if contents and ItemAuditor:GetIDFromLink(contents.link) == id then
Asa@66 94 total = total + contents.count
Asa@66 95 end
Asa@66 96 end
Asa@66 97 end
Asa@66 98 return total
Asa@66 99 end;
Asa@66 100 };
Asa@66 101 setUp = function()
Asa@66 102 ItemAuditor:Print('Unit Test setUp')
Asa@66 103 backups['ItemAuditor.db'] = ItemAuditor.db
Asa@66 104 ItemAuditor.db = {
Asa@66 105 char = {
Asa@66 106 ah = 1,
Asa@66 107 use_quick_auctions = false,
Asa@66 108 crafting_threshold = 1,
Asa@66 109 auction_threshold = 0.15,
Asa@66 110 output_chat_frame = nil,
Asa@66 111 },
Asa@66 112 profile = {
Asa@66 113 messages = {
Asa@66 114 cost_updates = true,
Asa@66 115 queue_skip = false,
Asa@66 116 },
Asa@66 117 ItemAuditor_enabled = true,
Asa@66 118 -- This is for development, so I have no plans to turn it into an option.
Asa@66 119 show_debug_frame_on_startup = false,
Asa@66 120 },
Asa@66 121 factionrealm = {
Asa@66 122 items = {},
Asa@66 123 item_account = {},
Asa@66 124 },
Asa@66 125 }
Asa@66 126
Asa@82 127 backups['ItemAuditor.GetItemCount'] = ItemAuditor.GetItemCount
Asa@82 128 ItemAuditor.GetItemCount = function(self, id)
Asa@66 129 local total = GetItemCount(id)
Asa@66 130 total = total + (fakeAlts[id] or 0)
Asa@66 131
Asa@66 132 return total
Asa@66 133 end
Asa@66 134
Asa@66 135 ItemAuditor:UpdateCurrentInventory()
Asa@66 136
Asa@66 137 return {};
Asa@66 138 end;
Asa@66 139 tearDown = function()
Asa@66 140 ItemAuditor:Print('Unit Test tearDown')
Asa@66 141 ItemAuditor:UpdateCurrentInventory()
Asa@66 142 ItemAuditor.db = backups['ItemAuditor.db']
Asa@82 143 ItemAuditor.GetItemCount = backups['ItemAuditor.GetItemCount']
Asa@66 144 end;
Asa@66 145
Asa@66 146 testMockGetContainerItemLink = function()
Asa@66 147 assert(GetContainerItemLink(0, 1) == FROSTWEAVE)
Asa@66 148 end;
Asa@66 149
Asa@66 150 testGetItemCost = function(ia)
Asa@66 151 local total, individual, count = ItemAuditor:GetItemCost(FROSTWEAVE)
Asa@66 152 assert(total == 0, "total: "..total)
Asa@66 153 assert(individual == 0, "individual: "..individual)
Asa@66 154 assert(count == 20, "count: "..count)
Asa@66 155
Asa@66 156 local total, individual, count = ItemAuditor:GetItemCost(BOLT_FW)
Asa@66 157 assert(total == 0, "total: "..total)
Asa@66 158 assert(individual == 0, "individual: "..individual)
Asa@66 159 assert(count == 0, "count: "..count)
Asa@66 160 end;
Asa@66 161
Asa@66 162 testGetCurrentInventory = function()
Asa@66 163 local inventory = ItemAuditor:GetCurrentInventory()
Asa@66 164 assert(inventory.items['item:33470'] == 10)
Asa@66 165 assert(inventory.items['item:14047'] == 20)
Asa@66 166 assert(inventory.money == fakeMoney)
Asa@66 167 end;
Asa@66 168
Asa@66 169 testUpdateAuditPurchase = function()
Asa@66 170 ItemAuditor:UpdateCurrentInventory()
Asa@66 171 local backupSaveValue = ItemAuditor.SaveValue
Asa@66 172
Asa@66 173 local price = 200000
Asa@66 174
Asa@66 175 ItemAuditor.SaveValue = function(self, link, value, countChange)
Asa@66 176 assertEquals({'item:33470', price, 20}, {link, value, countChange})
Asa@66 177 return backupSaveValue(self, link, value, countChange)
Asa@66 178 end
Asa@66 179
Asa@66 180 ItemAuditor:UpdateAudit()
Asa@66 181
Asa@66 182 assertEquals({0, 0, 20}, {ItemAuditor:GetItemCost(FROSTWEAVE)})
Asa@66 183
Asa@66 184 -- buy 20 for 20g. Because I already had 20 frostweave, this will
Asa@66 185 -- be counted like I spent 40g on 40 frostweave
Asa@66 186 fakeBags[1].contents[5] = {link = FROSTWEAVE, count=20}
Asa@66 187 fakeMoney = fakeMoney - price
Asa@66 188 ItemAuditor:UpdateAudit()
Asa@66 189
Asa@66 190 assertEquals({400000, 10000, 40}, {ItemAuditor:GetItemCost(FROSTWEAVE)})
Asa@66 191
Asa@66 192 ItemAuditor.SaveValue = function(self, link, value, countChange)
Asa@66 193 assertEquals({'item:33470', 0-price, -10}, {link, value, countChange})
Asa@66 194 return backupSaveValue(self, link, value, countChange)
Asa@66 195 end
Asa@66 196
Asa@66 197 -- Sell 10 frostweave for 20g.
Asa@66 198 fakeBags[1].contents[5] = {link = FROSTWEAVE, count=10}
Asa@66 199 fakeMoney = fakeMoney + price
Asa@66 200 ItemAuditor:UpdateAudit()
Asa@66 201
Asa@66 202 assertEquals({200000, 6667, 30}, {ItemAuditor:GetItemCost(FROSTWEAVE)})
Asa@66 203
Asa@66 204 ItemAuditor.SaveValue = backupSaveValue
Asa@66 205 end
Asa@66 206 }
Asa@66 207
Asa@66 208 if WoWUnit then
Asa@66 209 WoWUnit:AddTestSuite("ItemAuditor", UnitTests);
Asa@66 210
Asa@69 211 -- WoWUnitConsole:SlashCommand('ItemAuditor')
Asa@66 212 end
Asa@66 213 --@end-debug@