/test/unit/crate_test.rb

https://github.com/buffpojken/PMOG-OS · Ruby · 444 lines · 337 code · 81 blank · 26 comment · 0 complexity · 65ce73d591555e504999d08391197309 MD5 · raw file

  1. require File.dirname(__FILE__) + '/../test_helper'
  2. class CrateTest < Test::Unit::TestCase
  3. fixtures :upgrades, :users, :user_levels, :tools, :locations, :crates, :tools, :levels, :inventories, :ability_statuses
  4. def setup
  5. @suttree = users(:suttree)
  6. # suttree has 0 pings
  7. # suttree has 10 crates and 10 mines
  8. # suttree has lvl 5 all classes
  9. @marc = users(:marc)
  10. # marc has 1000 pings
  11. # marc has 10 crates and 10 mines
  12. # marc has lvl 20 all classes
  13. @location = Location.find(:first)
  14. # basic stub to help us get started
  15. @params = {}
  16. @params[:crate] = {}
  17. @params[:crate][:datapoints] = 0
  18. @params[:crate][:tools] = {}
  19. @params[:crate][:tools][:mines] = 0
  20. @QUESTION = "hurp"
  21. @ANSWER = "durp"
  22. end
  23. ##########################
  24. # TEST CREATE AND DEPOSIT
  25. #
  26. def test_no_params
  27. crate = nil
  28. assert_no_difference(Crate, :count) do
  29. assert_raises(Crate::InvalidParameters) do
  30. crate = Crate.create_and_deposit(@suttree, @location, {})
  31. end end
  32. assert_equal nil, crate
  33. end
  34. def test_no_crate
  35. @suttree.inventory.set( :crates, 0 )
  36. assert_no_difference Crate, :count do
  37. assert_raises(Crate::NoCrateToDeposit) do
  38. Crate.create_and_deposit(@suttree, @location, @params)
  39. end end
  40. end
  41. def test_create_empty_crate
  42. assert_no_difference Crate, :count do
  43. assert_raises(Crate::EmptyCrateError) do
  44. Crate.create_and_deposit(@suttree, @location, @params)
  45. end end
  46. end
  47. def test_no_shoats_allowed
  48. @params[:crate][:datapoints] = 10
  49. @suttree.user_level.benefactor_cp = 0
  50. @suttree.user_level.save
  51. assert_no_difference Crate, :count do
  52. assert_raises(User::InsufficientExperienceError) do
  53. Crate.create_and_deposit(@suttree, @location, @params)
  54. end end
  55. end
  56. def test_negative_dp
  57. @params[:crate][:datapoints] = -1
  58. @params[:crate][:tools][:mines] = 5
  59. crate = nil
  60. assert_no_difference Crate, :count do
  61. assert_raises(Crate::InvalidCrateInventory_NegativeDatapoints) do
  62. crate = Crate.create_and_deposit(@suttree, @location, @params)
  63. end end
  64. assert_equal nil, crate
  65. end
  66. def test_insufficient_dp
  67. @params[:crate][:datapoints] = @suttree.datapoints + 100
  68. crate = nil
  69. assert_no_difference Crate, :count do
  70. assert_raises(User::InsufficientDPError) do
  71. crate = Crate.create_and_deposit(@suttree, @location, @params)
  72. end end
  73. assert_equal nil, crate
  74. end
  75. def test_too_much_loot
  76. @suttree.datapoints = 10001
  77. @suttree.save
  78. @params[:crate][:datapoints] = 10000
  79. assert_no_difference Crate, :count do
  80. assert_raises(Crate::InvalidCrateInventory_TooManyDatapoints) do
  81. Crate.create_and_deposit(@suttree, @location, @params)
  82. end end
  83. end
  84. def test_not_enough_loot
  85. @params[:crate][:datapoints] = 2
  86. assert_no_difference Crate, :count do
  87. assert_raises(Crate::InvalidCrateInventory_NotEnoughLoot) do
  88. Crate.create_and_deposit(@suttree, @location, @params)
  89. end end
  90. end
  91. def test_valid_crate
  92. # works, user has dp and crates
  93. @suttree.datapoints = 500
  94. @suttree.save
  95. @suttree.inventory.set( :mines, 5 )
  96. @params[:crate][:datapoints] = 500
  97. @params[:crate][:tools][:mines] = 5
  98. crate = nil
  99. assert_difference lambda{@suttree.inventory.reload.mines}, :call, -5 do
  100. assert_difference lambda{@suttree.reload.datapoints}, :call, -@params[:crate][:datapoints] do
  101. assert_difference Crate, :count do
  102. crate = Crate.create_and_deposit(@suttree, @location, @params)
  103. end end end
  104. assert crate
  105. end
  106. ###########
  107. # UPGRADES
  108. #
  109. def test_upgrade_not_specified
  110. @params[:upgrade] = {}
  111. assert_no_difference Crate, :count do
  112. assert_raises(CrateUpgrade::NoUpgradeSpecified) do
  113. Crate.create_and_deposit(@suttree, @location, @params)
  114. end end
  115. end
  116. # EXPLODING CRATES
  117. def test_exploding_crate_no_pings
  118. @params[:upgrade] = {}
  119. @params[:upgrade][:exploding] = true
  120. @suttree.inventory.set :mines, 1
  121. assert_no_difference Crate, :count do
  122. assert_raises(User::InsufficientPingsError) do
  123. Crate.create_and_deposit(@suttree, @location, @params)
  124. end end
  125. end
  126. def test_exploding_crate_no_mine
  127. @params[:upgrade] = {}
  128. @params[:upgrade][:exploding] = true
  129. @marc.inventory.set :mines, 0
  130. assert_no_difference Crate, :count do
  131. assert_raises(CrateUpgrade::ExplodingCrate_NoMines) do
  132. Crate.create_and_deposit(@marc, @location, @params)
  133. end end
  134. end
  135. def test_exploding_crate_with_inventory
  136. @params[:crate][:tools][:mines] = 5
  137. @params[:upgrade] = {}
  138. @params[:upgrade][:exploding] = true
  139. assert_no_difference Crate, :count do
  140. assert_raises(CrateUpgrade::ExplodingCrate_HasTools) do
  141. Crate.create_and_deposit(@marc, @location, @params)
  142. end end
  143. end
  144. def test_exploding_crate_underlevel
  145. @params[:upgrade] = {}
  146. @params[:upgrade][:exploding] = true
  147. @marc.user_level.destroyer_cp = 0
  148. @marc.user_level.save
  149. assert_no_difference Crate, :count do
  150. assert_raises(User::InsufficientExperienceError) do
  151. Crate.create_and_deposit(@marc, @location, @params)
  152. end end
  153. end
  154. def test_exploding_crate_success
  155. @params[:upgrade] = {}
  156. @params[:upgrade][:exploding] = true
  157. crate = nil
  158. assert_difference Crate, :count do
  159. assert_difference lambda{@marc.reload.available_pings}, :call, - Upgrade.cached_single('exploding_crate').ping_cost do
  160. assert_difference lambda{@marc.inventory.reload.mines}, :call, -1 do
  161. crate = Crate.create_and_deposit(@marc, @location, @params)
  162. end end end
  163. assert crate
  164. end
  165. # PUZZLE CRATES
  166. def test_puzzle_crate_underlevel
  167. @params[:upgrade] = {}
  168. @params[:upgrade][:locked] = true
  169. @params[:upgrade][:question] = @QUESTION
  170. @params[:upgrade][:answer] = @ANSWER
  171. @marc.user_level.benefactor_cp = 300 #lvl 6, req for puzzle is 7
  172. @marc.user_level.save
  173. assert_no_difference CrateUpgrade, :count do
  174. assert_raises(User::InsufficientExperienceError) do
  175. Crate.create_and_deposit(@marc, @location, @params)
  176. end end
  177. end
  178. def test_puzzle_crate_no_question
  179. @params[:upgrade] = {}
  180. @params[:upgrade][:locked] = true
  181. @params[:upgrade][:question] = nil
  182. @params[:upgrade][:answer] = @ANSWER
  183. assert_no_difference CrateUpgrade, :count do
  184. assert_raises(CrateUpgrade::PuzzleCrate_NoQuestion) do
  185. Crate.create_and_deposit(@marc, @location, @params)
  186. end end
  187. end
  188. def test_puzzle_crate_no_pings
  189. @params[:upgrade] = {}
  190. @params[:upgrade][:locked] = true
  191. @params[:upgrade][:question] = @QUESTION
  192. @params[:upgrade][:answer] = @ANSWER
  193. @marc.available_pings = 0
  194. @marc.save
  195. upgrade = nil
  196. assert_no_difference CrateUpgrade, :count do
  197. assert_raises(User::InsufficientPingsError) do
  198. Crate.create_and_deposit(@marc, @location, @params)
  199. end end
  200. end
  201. def test_puzzle_crate_success
  202. @params[:crate][:tools][:mines] = 5
  203. @params[:upgrade] = {}
  204. @params[:upgrade][:locked] = true
  205. @params[:upgrade][:question] = @QUESTION
  206. @params[:upgrade][:answer] = @ANSWER
  207. crate = nil
  208. assert_difference(Crate, :count, 1) do
  209. assert_difference(CrateUpgrade, :count, 1) do
  210. assert_difference(UpgradeUse, :count, 1) do
  211. crate = Crate.create_and_deposit(@marc, @location, @params)
  212. end end end
  213. assert crate, "Failed to create an Exploding Puzzle Crate"
  214. assert_equal crate.crate_upgrade.puzzle_question, @QUESTION, "Puzzle Question was not as user specified"
  215. assert_equal crate.crate_upgrade.puzzle_answer, @ANSWER, "Puzzle Answer was not as user specified"
  216. end
  217. # EVER CRATES
  218. def test_ever_crate
  219. end
  220. def test_deposit_ever_crate_no_tools
  221. @params[:crate][:tools][:mines] = 2
  222. @params[:upgrade] = {}
  223. @params[:upgrade][:charges] = 5
  224. # attempt to fill 10 mines with only 8
  225. @marc.inventory.set :mines, 8
  226. assert_no_difference Crate, :count do
  227. assert_raises(CrateUpgrade::EverCrate_TooManyCharges) do
  228. Crate.create_and_deposit(@marc, @location, @params)
  229. end end
  230. end
  231. def test_deposit_ever_crate_no_dp
  232. @params[:crate][:datapoints] = 10
  233. @params[:upgrade] = {}
  234. @params[:upgrade][:charges] = 5
  235. # attempt to fill 50 dp with only 40
  236. @marc.datapoints = 40
  237. @marc.save
  238. assert_no_difference Crate, :count do
  239. assert_raises(CrateUpgrade::EverCrate_TooManyCharges) do
  240. Crate.create_and_deposit(@marc, @location, @params)
  241. end end
  242. end
  243. def test_deposit_ever_crate_success
  244. @params[:crate][:datapoints] = 10
  245. @params[:crate][:tools][:mines] = 2
  246. @params[:upgrade] = {}
  247. @params[:upgrade][:charges] = 5
  248. @marc.datapoints = 50
  249. @marc.save
  250. @marc.inventory.set :mines, 10
  251. crate = nil
  252. assert_difference lambda{@marc.reload.datapoints}, :call, -50 do
  253. assert_difference lambda{@marc.inventory.reload.mines}, :call, -10 do
  254. assert_difference Crate, :count do
  255. crate = Crate.create_and_deposit(@marc, @location, @params)
  256. end end end
  257. assert crate
  258. assert_equal 10, crate.inventory.datapoints
  259. assert_equal 2, crate.inventory.mines
  260. assert_equal 5, crate.charges
  261. end
  262. def test_exploding_puzzle_crate_failures
  263. #FIXME this is going to be more than 1 test eventually
  264. end
  265. def test_exploding_puzzle_crate_success
  266. @params[:upgrade] = {}
  267. @params[:upgrade][:exploding] = true
  268. @params[:upgrade][:locked] = true
  269. @params[:upgrade][:question] = @QUESTION
  270. @params[:upgrade][:answer] = @ANSWER
  271. crate = nil
  272. assert_difference lambda{@marc.reload.available_pings}, :call, -(Upgrade.cached_single('exploding_crate').ping_cost + Upgrade.cached_single('puzzle_crate').ping_cost) do
  273. assert_difference lambda{@marc.inventory.reload.mines}, :call, -1 do
  274. assert_difference Crate, :count do
  275. assert_difference CrateUpgrade, :count, 1 do
  276. assert_difference UpgradeUse, :count, 2 do
  277. crate = Crate.create_and_deposit(@marc, @location, @params)
  278. end end end end end
  279. assert crate, "Failed to create an Exploding Puzzle Crate"
  280. assert_equal crate.crate_upgrade.puzzle_question, @QUESTION, "Puzzle Question was not as user specified"
  281. assert_equal crate.crate_upgrade.puzzle_answer, @ANSWER, "Puzzle Answer was not as user specified"
  282. assert_equal crate.crate_upgrade.exploding, true, "Failed to specify crate as exploding"
  283. end
  284. def test_ever_puzzle_crate
  285. #FIXME too
  286. end
  287. def test_exploding_ever_crate
  288. end
  289. def test_exploding_ever_crate_success
  290. @params[:upgrade] = {}
  291. @params[:upgrade][:exploding] = true
  292. @params[:upgrade][:charges] = 5
  293. ping_cost = (Upgrade.cached_single('exploding_crate').ping_cost * 5) + Upgrade.cached_single('ever_crate').ping_cost
  294. crate = nil
  295. assert_difference Crate, :count do
  296. assert_difference lambda{@marc.reload.available_pings}, :call, -ping_cost do
  297. assert_difference lambda{@marc.inventory.reload.mines}, :call, -5 do
  298. crate = Crate.create_and_deposit(@marc, @location, @params)
  299. end end end
  300. assert crate
  301. assert crate.crate_upgrade.exploding.to_bool
  302. assert_equal crate.charges, 5
  303. end
  304. def test_exploding_ever_puzzle_crate
  305. #FIXME theres jsut all kinds of wild combinations aren't there.
  306. # building these is mostly copy paste work i'll do it when i'm feeling more burnt out and can't focus on anything harder -alex
  307. end
  308. ############
  309. # TEST LOOT
  310. #
  311. def test_loot
  312. @suttree.reward_datapoints(500)
  313. @suttree.inventory.set( :crates, 5 )
  314. assert_difference Crate, :count do
  315. assert @c = Crate.create_and_deposit(@suttree, @location, { :crate => { :datapoints => 10 } })
  316. end
  317. assert_difference lambda{@suttree.reload.datapoints}, :call, 10 do
  318. assert_difference Event, :count do
  319. assert loot = @c.loot(@suttree)
  320. assert_equal @suttree.login, loot["user"]
  321. assert_equal nil, loot["comment"]
  322. end end
  323. end
  324. def test_loot_ever_crate
  325. params = {}
  326. params[:crate] = {}
  327. params[:crate][:datapoints] = 10
  328. params[:crate][:tools] = {}
  329. params[:crate][:tools][:mines] = 1
  330. params[:upgrade] = {}
  331. params[:upgrade][:charges] = 5
  332. @marc.datapoints = 50
  333. @marc.save
  334. @marc.inventory.set :mines, 5
  335. crate = Crate.create_and_deposit(@marc, @location, params)
  336. assert_difference(Event, :count) do # make sure the crate was looted
  337. crate.loot(@suttree)
  338. end
  339. assert_raises(Crate::CrateNotFound) do # make sure the crate is not looted
  340. crate.loot(@suttree)
  341. end
  342. assert_difference(Event, :count) do # make sure someone else can still loot it
  343. crate.loot(@marc)
  344. end
  345. assert_equal crate.reload.charges, 3 # consumed 2 of 5 charges
  346. end
  347. def test_loot_expiring_ever_crate_message
  348. params = {}
  349. params[:crate] = {}
  350. params[:crate][:datapoints] = 10
  351. params[:upgrade] = {}
  352. params[:upgrade][:charges] = 2
  353. @marc.datapoints = 50
  354. @marc.save
  355. crate = Crate.create_and_deposit(@marc, @location, params)
  356. assert_difference Event, :count, 1 do # for non-final charges we pmail the crate layer once
  357. crate.loot(@suttree)
  358. end
  359. assert_difference Event, :count, 2 do # if its the last charge, an extra message about expiration should go out to the crate owner
  360. crate.loot(@marc)
  361. end
  362. end
  363. end