# HG changeset patch # User Asa Ayers # Date 1280279879 25200 # Node ID b7bc0488f13b4c4dc8770c6a2789538466993f6c # Parent 32d53abee666882059418ccdd0ff90893d30086f Adding unit tests diff -r 32d53abee666 -r b7bc0488f13b ItemAuditor.toc --- a/ItemAuditor.toc Tue Jul 27 18:15:38 2010 -0700 +++ b/ItemAuditor.toc Tue Jul 27 18:17:59 2010 -0700 @@ -2,10 +2,10 @@ ## Title: Item Auditor ## Notes: This will keep track of how much you have paid per item in your inventory. Only one of (Auctionator, Auctioneer, AuctionLite, AuctionMaster) is needed to determine which items are profitable to craft. ## Author: Asa Ayers -## Version: 0.1 +## Version: @project-version@ ## SavedVariables: ItemAuditorDB ## Dependencies: Altoholic -## OptionalDeps: QuickAuctions, Skillet, LilSparkysWorkshop, Auctionator, Auctioneer, AuctionLite, AuctionMaster, DevTools +## OptionalDeps: QuickAuctions, Skillet, LilSparkysWorkshop, Auctionator, Auctioneer, AuctionLite, AuctionMaster, DevTools, WoWUnit embeds.xml @@ -26,3 +26,5 @@ Modules\QuickAuctions.lua Modules\Api.lua + +Modules\UnitTests.lua diff -r 32d53abee666 -r b7bc0488f13b Modules/UnitTests.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Modules/UnitTests.lua Tue Jul 27 18:17:59 2010 -0700 @@ -0,0 +1,213 @@ +--@debug@ +local ItemAuditor = select(2, ...) +local Utils= ItemAuditor:GetModule("Utils") + +local function assertTable(tblA, tblB, msg) + for key, value in pairs(tblA) do + assert(tblA[key] == tblB[key], msg) + end + for key, value in pairs(tblB) do + assert(tblA[key] == tblB[key], msg) + end +end + +local UnitTests = {}; +local backups = {} + +local FROSTWEAVE = "\124cffffffff\124Hitem:33470:0:0:0:0:0:0:0:0\124h[Frostweave Cloth]\124h\124r" +local RUNECLOTH = "\124cffffffff\124Hitem:14047:0:0:0:0:0:0:0:0\124h[Runecloth]\124h\124r" +local BOLT_FW = "\124cffffd000\124Henchant:55899\124h[Tailoring: Bolt of Frostweave]\124h\124r" + +local fakeBags = { + [0] = { + size = 16, + contents = { + [0] = nil, + [1] = {link = FROSTWEAVE, count=10}, + } + }, + [1] = { + size = 8, + contents = { + [0] = {link = RUNECLOTH, count=20}, + } + }, +} + +local fakeMoney = 314159265 + +local fakeAlts = { + [33470] = 10, -- Frostweave +} + + +UnitTests.Utils = { + mocks = { + }; + setUp = function() + return {}; + end; + tearDown = function() + end; + + testGetItemID = function() + local id = Utils.GetItemID(FROSTWEAVE) + assert(id == 33470) + + -- This test doesn't work yet. + -- local id = Utils:GetItemID('invalid link') + -- assert(id == nil) + end; + + testGetIDFromLink = function() + -- This should be moved to Utils + local id = ItemAuditor:GetIDFromLink(FROSTWEAVE) + assert(id == 33470) + end; + + testGetSafeLink = function() + -- This should be moved to Utils + local link = ItemAuditor:GetSafeLink(FROSTWEAVE) + assert(link == 'item:33470') + end; +} + +UnitTests.Core = { + mocks = { + NUM_BAG_SLOTS = 1; + GetContainerNumSlots = function(bagID) + return (fakeBags[bagID] and fakeBags[bagID].size) or 0 + end; + GetContainerItemLink = function(bagID, slotID) + return fakeBags[bagID] and fakeBags[bagID].contents[slotID] and fakeBags[bagID].contents[slotID].link + end; + GetMoney = function() + return fakeMoney + end; + GetItemCount = function(link) + local total = 0 + local id = tonumber(link) or ItemAuditor:GetIDFromLink(link) + + for bagID, bag in pairs(fakeBags) do + for slotID, contents in pairs(bag.contents) do + if contents and ItemAuditor:GetIDFromLink(contents.link) == id then + total = total + contents.count + end + end + end + return total + end; + }; + setUp = function() + ItemAuditor:Print('Unit Test setUp') + backups['ItemAuditor.db'] = ItemAuditor.db + ItemAuditor.db = { + char = { + ah = 1, + use_quick_auctions = false, + crafting_threshold = 1, + auction_threshold = 0.15, + output_chat_frame = nil, + }, + profile = { + messages = { + cost_updates = true, + queue_skip = false, + }, + ItemAuditor_enabled = true, + -- This is for development, so I have no plans to turn it into an option. + show_debug_frame_on_startup = false, + }, + factionrealm = { + items = {}, + item_account = {}, + }, + } + + backups['Altoholic.GetItemCount'] = Altoholic.GetItemCount + Altoholic.GetItemCount = function(self, id) + local total = GetItemCount(id) + total = total + (fakeAlts[id] or 0) + + return total + end + + ItemAuditor:UpdateCurrentInventory() + + return {}; + end; + tearDown = function() + ItemAuditor:Print('Unit Test tearDown') + ItemAuditor:UpdateCurrentInventory() + ItemAuditor.db = backups['ItemAuditor.db'] + Altoholic.GetItemCount = backups['Altoholic.GetItemCount'] + end; + + testMockGetContainerItemLink = function() + assert(GetContainerItemLink(0, 1) == FROSTWEAVE) + end; + + testGetItemCost = function(ia) + local total, individual, count = ItemAuditor:GetItemCost(FROSTWEAVE) + assert(total == 0, "total: "..total) + assert(individual == 0, "individual: "..individual) + assert(count == 20, "count: "..count) + + local total, individual, count = ItemAuditor:GetItemCost(BOLT_FW) + assert(total == 0, "total: "..total) + assert(individual == 0, "individual: "..individual) + assert(count == 0, "count: "..count) + end; + + testGetCurrentInventory = function() + local inventory = ItemAuditor:GetCurrentInventory() + assert(inventory.items['item:33470'] == 10) + assert(inventory.items['item:14047'] == 20) + assert(inventory.money == fakeMoney) + end; + + testUpdateAuditPurchase = function() + ItemAuditor:UpdateCurrentInventory() + local backupSaveValue = ItemAuditor.SaveValue + + local price = 200000 + + ItemAuditor.SaveValue = function(self, link, value, countChange) + assertEquals({'item:33470', price, 20}, {link, value, countChange}) + return backupSaveValue(self, link, value, countChange) + end + + ItemAuditor:UpdateAudit() + + assertEquals({0, 0, 20}, {ItemAuditor:GetItemCost(FROSTWEAVE)}) + + -- buy 20 for 20g. Because I already had 20 frostweave, this will + -- be counted like I spent 40g on 40 frostweave + fakeBags[1].contents[5] = {link = FROSTWEAVE, count=20} + fakeMoney = fakeMoney - price + ItemAuditor:UpdateAudit() + + assertEquals({400000, 10000, 40}, {ItemAuditor:GetItemCost(FROSTWEAVE)}) + + ItemAuditor.SaveValue = function(self, link, value, countChange) + assertEquals({'item:33470', 0-price, -10}, {link, value, countChange}) + return backupSaveValue(self, link, value, countChange) + end + + -- Sell 10 frostweave for 20g. + fakeBags[1].contents[5] = {link = FROSTWEAVE, count=10} + fakeMoney = fakeMoney + price + ItemAuditor:UpdateAudit() + + assertEquals({200000, 6667, 30}, {ItemAuditor:GetItemCost(FROSTWEAVE)}) + + ItemAuditor.SaveValue = backupSaveValue + end +} + +if WoWUnit then + WoWUnit:AddTestSuite("ItemAuditor", UnitTests); + + WoWUnitConsole:SlashCommand('ItemAuditor') +end +--@end-debug@ \ No newline at end of file