From 00bdb4c92eb78273fa6473fd0d4b89e5eab78c78 Mon Sep 17 00:00:00 2001 From: Jan Kantert Date: Sat, 7 May 2016 17:23:19 +0200 Subject: [PATCH] add test for Credit Mode --- .../machine_files/credits/config/config.yaml | 49 ++++ .../credits/modes/credits/config/config.yaml | 8 + mpf/tests/test_CreditsMode.py | 221 ++++++++++++++++++ 3 files changed, 278 insertions(+) create mode 100644 mpf/tests/machine_files/credits/config/config.yaml create mode 100644 mpf/tests/machine_files/credits/modes/credits/config/config.yaml create mode 100644 mpf/tests/test_CreditsMode.py diff --git a/mpf/tests/machine_files/credits/config/config.yaml b/mpf/tests/machine_files/credits/config/config.yaml new file mode 100644 index 000000000..4dcbcb0c6 --- /dev/null +++ b/mpf/tests/machine_files/credits/config/config.yaml @@ -0,0 +1,49 @@ +#config_version=4 + +modes: + - credits + +machine: + min_balls: 0 + +switches: + s_left_coin: + number: + s_center_coin: + number: + s_right_coin: + number: + s_esc: + number: + s_start: + number: + tags: start + +coils: + c_eject: + number: + +credits: + max_credits: 12 + free_play: no + service_credits_switch: s_esc + switches: + - switch: s_left_coin + type: money + value: .25 + - switch: s_center_coin + type: money + value: .25 + - switch: s_right_coin + type: money + value: 1 + pricing_tiers: + - price: .50 + credits: 1 + - price: 2 + credits: 5 + fractional_credit_expiration_time: 15m + credit_expiration_time: 2h + persist_credits_while_off_time: 1h + free_play_string: FREE PLAY + credits_string: CREDITS \ No newline at end of file diff --git a/mpf/tests/machine_files/credits/modes/credits/config/config.yaml b/mpf/tests/machine_files/credits/modes/credits/config/config.yaml new file mode 100644 index 000000000..e009ff11a --- /dev/null +++ b/mpf/tests/machine_files/credits/modes/credits/config/config.yaml @@ -0,0 +1,8 @@ +#config_version=4 + +mode: + priority: 11000 + start_events: machine_reset_phase_3 + stop_on_ball_end: False + + diff --git a/mpf/tests/test_CreditsMode.py b/mpf/tests/test_CreditsMode.py new file mode 100644 index 000000000..f2c91126f --- /dev/null +++ b/mpf/tests/test_CreditsMode.py @@ -0,0 +1,221 @@ +from mock import MagicMock +from mpf.tests.MpfTestCase import MpfTestCase + + +class TestShots(MpfTestCase): + + def getConfigFile(self): + return 'config.yaml' + + def getMachinePath(self): + return 'tests/machine_files/credits/' + + def start_game(self, should_work): + # shots only work in games so we have to do this a lot + self.machine.playfield.add_ball = MagicMock() + self.machine.ball_controller.num_balls_known = 3 + self.hit_and_release_switch("s_start") + self.advance_time_and_run() + if should_work: + self.assertIsNotNone(self.machine.game) + self.machine.game.balls_in_play = 0 + self.advance_time_and_run() + else: + self.assertIsNone(self.machine.game) + + def stop_game(self): + # stop game + self.assertIsNotNone(self.machine.game) + self.machine.game.game_ending() + self.advance_time_and_run() + self.assertIsNone(self.machine.game) + + def testFreePlay(self): + self.machine.modes.credits.stop() + self.machine_run() + self.assertEqual("FREE PLAY", self.machine.get_machine_var('credits_string')) + + self.machine.modes.credits.credits_config['free_play'] = True + self.machine.modes.credits.credits_config['free_play_string'] = "FREEEE" + self.machine.modes.credits.start() + self.machine_run() + + self.assertEqual("FREEEE", self.machine.get_machine_var('credits_string')) + + # game start should work + self.start_game(True) + + def testToggleEvents(self): + self.assertTrue(self.machine.mode_controller.is_active('credits')) + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + self.post_event("toggle_credit_play") + self.assertEqual("FREE PLAY", self.machine.get_machine_var('credits_string')) + + self.post_event("toggle_credit_play") + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + self.start_game(False) + + self.post_event("toggle_credit_play") + self.assertEqual("FREE PLAY", self.machine.get_machine_var('credits_string')) + + self.start_game(True) + self.stop_game() + + self.post_event("enable_credit_play") + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + self.post_event("enable_credit_play") + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + self.post_event("enable_free_play") + self.assertEqual("FREE PLAY", self.machine.get_machine_var('credits_string')) + + self.post_event("enable_free_play") + self.assertEqual("FREE PLAY", self.machine.get_machine_var('credits_string')) + + def testCredits(self): + self.assertTrue(self.machine.mode_controller.is_active('credits')) + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + # no credits no game + self.start_game(False) + + self.hit_and_release_switch("s_left_coin") + self.machine_run() + + self.assertEqual("CREDITS 1/2", self.machine.get_machine_var('credits_string')) + + # not enough credits. no game + self.start_game(False) + + self.hit_and_release_switch("s_left_coin") + self.machine_run() + + self.assertEqual("CREDITS 1", self.machine.get_machine_var('credits_string')) + + # one is enough for a game + self.start_game(True) + self.stop_game() + + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + # but only one + self.start_game(False) + + self.hit_and_release_switch("s_right_coin") + self.machine_run() + self.assertEqual("CREDITS 2", self.machine.get_machine_var('credits_string')) + + # no more price tier after game + self.hit_and_release_switch("s_left_coin") + self.hit_and_release_switch("s_left_coin") + self.machine_run() + self.assertEqual("CREDITS 3", self.machine.get_machine_var('credits_string')) + + def testMorePlayers(self): + self.assertTrue(self.machine.mode_controller.is_active('credits')) + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + self.hit_and_release_switch("s_left_coin") + self.hit_and_release_switch("s_left_coin") + self.machine_run() + + self.assertEqual("CREDITS 1", self.machine.get_machine_var('credits_string')) + + # one is enough for a game + self.machine.playfield.add_ball = MagicMock() + self.machine.ball_controller.num_balls_known = 3 + self.hit_and_release_switch("s_start") + self.advance_time_and_run() + self.assertIsNotNone(self.machine.game) + + # no more credits + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + self.assertEqual(1, self.machine.game.num_players) + # try to add another player + self.hit_and_release_switch("s_start") + # fails + self.assertEqual(1, self.machine.game.num_players) + + # add credits + self.hit_and_release_switch("s_right_coin") + self.machine_run() + self.assertEqual("CREDITS 2", self.machine.get_machine_var('credits_string')) + + # try to add another player + self.hit_and_release_switch("s_start") + # wrorks + self.assertEqual(2, self.machine.game.num_players) + self.machine_run() + self.assertEqual("CREDITS 1", self.machine.get_machine_var('credits_string')) + + def testPricingTiers(self): + self.hit_and_release_switch("s_right_coin") + self.machine_run() + self.assertEqual("CREDITS 2", self.machine.get_machine_var('credits_string')) + + self.hit_and_release_switch("s_right_coin") + self.machine_run() + self.assertEqual("CREDITS 5", self.machine.get_machine_var('credits_string')) + + def testFractionalTimeout(self): + self.hit_and_release_switch("s_right_coin") + self.hit_and_release_switch("s_left_coin") + self.machine_run() + self.assertEqual("CREDITS 2 1/2", self.machine.get_machine_var('credits_string')) + + self.advance_time_and_run(60 * 15) + + self.assertEqual("CREDITS 2", self.machine.get_machine_var('credits_string')) + + # but not during game + self.hit_and_release_switch("s_left_coin") + self.machine_run() + self.assertEqual("CREDITS 2 1/2", self.machine.get_machine_var('credits_string')) + + self.start_game(True) + self.advance_time_and_run(60 * 15) + self.stop_game() + + self.machine_run() + self.assertEqual("CREDITS 1 1/2", self.machine.get_machine_var('credits_string')) + + # but timeout restarts + self.advance_time_and_run(60 * 15) + + self.assertEqual("CREDITS 1", self.machine.get_machine_var('credits_string')) + + def testCreditTimeout(self): + self.hit_and_release_switch("s_right_coin") + self.hit_and_release_switch("s_left_coin") + self.machine_run() + self.assertEqual("CREDITS 2 1/2", self.machine.get_machine_var('credits_string')) + + self.advance_time_and_run(3600 * 2) + + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + # but not during game + self.hit_and_release_switch("s_right_coin") + self.hit_and_release_switch("s_left_coin") + self.machine_run() + self.assertEqual("CREDITS 2 1/2", self.machine.get_machine_var('credits_string')) + + self.start_game(True) + self.advance_time_and_run(3600 * 2) + self.stop_game() + + self.machine_run() + self.assertEqual("CREDITS 1 1/2", self.machine.get_machine_var('credits_string')) + + # but timeout restarts + self.advance_time_and_run(3600 * 2) + + self.assertEqual("CREDITS 0", self.machine.get_machine_var('credits_string')) + + def testServiceCredits(self): + self.hit_and_release_switch("s_esc") + self.machine_run() + self.assertEqual("CREDITS 1", self.machine.get_machine_var('credits_string'))