test_videogame.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. # jogai - Python Game Library
  2. #
  3. # This library is free software; you can redistribute it and/or
  4. # modify it under the terms of the GNU Library General Public
  5. # License as published by the Free Software Foundation; either
  6. # version 2 of the License, or (at your option) any later version.
  7. #
  8. # This library is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. # Library General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU Library General Public
  14. # License along with this library; if not, write to the Free
  15. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16. #
  17. # Ramón Palleiro Rodríguez
  18. # Zero! Factorial Studio
  19. # info@zero.gal
  20. import pygame
  21. import pytest
  22. from pytest import fixture, mark
  23. from jogai import _globals, settings
  24. from jogai.character import Character
  25. from jogai.exceptions import KeyPressedNotFoundError
  26. from jogai.groups import RectangleGroup
  27. from jogai.texts import Chronometer, Scoreboard, Text
  28. from jogai.widgets import LevelBar
  29. class TestVideogame:
  30. def test_load_data_with_a_predefined_attribute_allowed(
  31. self, videogame_test
  32. ):
  33. videogame_test._load_data({'caption': 'foo'})
  34. assert pygame.display.get_caption()[0] == 'foo'
  35. def test_load_data_with_wrong_type(self, videogame_test):
  36. with pytest.raises(TypeError) as e:
  37. videogame_test._load_data('foo')
  38. assert (
  39. str(e.value) == 'the attributes in the input schema must be a dict'
  40. )
  41. @mark.parametrize(
  42. ('key, down'),
  43. [('a', False), ('ESCAPE', True)],
  44. )
  45. def test_simulate_key_press(self, videogame_test, key, down):
  46. videogame_test.simulate_key_press(key, down)
  47. events = pygame.event.get()
  48. for event in events:
  49. if event.type == pygame.KEYUP or event.type == pygame.KEYDOWN:
  50. assert pygame.key.name(event.key) == key.lower()
  51. @mark.parametrize(
  52. ('key, down'),
  53. [(-1, False), (None, True)],
  54. )
  55. def test_simulate_wrong_key_press(self, videogame_test, key, down):
  56. with pytest.raises(KeyPressedNotFoundError) as e:
  57. videogame_test.simulate_key_press(key, down)
  58. assert str(e.value) == 'the key pressed was not found'
  59. def test_add_character(self, videogame_test):
  60. character = Character('protagonist.png')
  61. videogame_test.add_character(character)
  62. assert character in _globals.vg_characters
  63. def test_add_character_with_wrong_type(self, videogame_test):
  64. with pytest.raises(TypeError) as e:
  65. videogame_test.add_character('foo')
  66. assert str(e.value) == 'only Character instances can be added'
  67. def test_add_chronometer(self, videogame_test):
  68. chronometer = Chronometer(30)
  69. videogame_test.add_chronometer(chronometer)
  70. assert chronometer in _globals.vg_chronometers
  71. def test_add_chronometer_with_wrong_type(self, videogame_test):
  72. with pytest.raises(TypeError) as e:
  73. videogame_test.add_chronometer('foo')
  74. assert str(e.value) == 'only Chronometer instances can be added'
  75. def test_add_group(self, videogame_test, square_group_test):
  76. videogame_test.add_group(square_group_test)
  77. assert square_group_test in _globals.vg_groups
  78. def test_add_group_with_wrong_type(self, videogame_test):
  79. with pytest.raises(TypeError) as e:
  80. videogame_test.add_group('foo')
  81. assert str(e.value) == 'only Group instances can be added'
  82. def test_add_levelbar(self, videogame_test):
  83. levelbar = LevelBar(3)
  84. videogame_test.add_levelbar(levelbar)
  85. assert levelbar in _globals.vg_levelbars
  86. def test_add_levelbar_with_wrong_type(self, videogame_test):
  87. with pytest.raises(TypeError) as e:
  88. videogame_test.add_levelbar('foo')
  89. assert str(e.value) == 'only LevelBar instances can be added'
  90. def test_add_scoreboard(self, videogame_test):
  91. scoreboard = Scoreboard('foo')
  92. videogame_test.add_scoreboard(scoreboard)
  93. assert scoreboard in _globals.vg_scoreboards
  94. def test_add_scoreboard_with_wrong_type(self, videogame_test):
  95. with pytest.raises(TypeError) as e:
  96. videogame_test.add_scoreboard('foo')
  97. assert str(e.value) == 'only Scoreboard instances can be added'
  98. def test_add_text(self, videogame_test):
  99. text = Text('foo')
  100. videogame_test.add_text(text)
  101. assert text in _globals.vg_texts
  102. def test_add_text_with_wrong_type(self, videogame_test):
  103. with pytest.raises(TypeError) as e:
  104. videogame_test.add_text('foo')
  105. assert str(e.value) == 'only Text instances can be added'
  106. def test_listen_quit_event(self, videogame_test):
  107. quit_event = pygame.event.Event(
  108. pygame.QUIT,
  109. mod=pygame.locals.KMOD_NONE,
  110. )
  111. pygame.event.post(quit_event)
  112. videogame_test.listen_events()
  113. assert pygame.display.get_init() == False
  114. videogame_test.init()
  115. videogame_test.load_environment('test')
  116. def test_listen_escape_event(self, videogame_test):
  117. videogame_test.simulate_key_press('ESCAPE', True)
  118. videogame_test.listen_events()
  119. assert pygame.display.get_init() == False
  120. videogame_test.init()
  121. videogame_test.load_environment('test')
  122. def test_get_color(self, videogame_test):
  123. color = videogame_test.get_color(
  124. videogame_test.settings.WINDOW_WIDTH - 1,
  125. videogame_test.settings.WINDOW_HEIGHT - 1,
  126. )
  127. assert len(color) == 3
  128. assert all([True if 0 <= c <= 255 else False for c in color])
  129. def test_get_color_with_wrong_type(self, videogame_test):
  130. with pytest.raises(TypeError) as e:
  131. videogame_test.get_color('foo', 'bar')
  132. assert (
  133. str(e.value)
  134. == 'the coordinates of the point must be a non-negative integers'
  135. )
  136. def test_get_color_out_of_range_values(self, videogame_test):
  137. with pytest.raises(ValueError) as e:
  138. videogame_test.get_color(-3, 100000)
  139. assert (
  140. str(e.value)
  141. == 'the coordinates of the point must be a non-negative integers'
  142. )
  143. @mark.parametrize('wait', [0, 1, -1, None, 'foo'])
  144. def test_quit_including_wrong_wait(self, videogame_test, wait):
  145. videogame_test.quit(wait)
  146. assert pygame.display.get_init() == False
  147. videogame_test.init()
  148. videogame_test.load_environment('test')
  149. def test_set_caption(self, videogame_test):
  150. videogame_test.set_caption('foo')
  151. assert pygame.display.get_caption()[0] == 'foo'
  152. @mark.parametrize('caption', [1, -1, None])
  153. def test_set_caption_with_wrong_type(self, videogame_test, caption):
  154. with pytest.raises(TypeError) as e:
  155. videogame_test.set_caption(caption)
  156. assert str(e.value) == 'the caption for the videogame must be a string'
  157. def test_set_gravity(self, videogame_test):
  158. gravity = 5
  159. videogame_test.set_gravity(gravity)
  160. assert _globals._gravity == gravity
  161. @mark.parametrize('gravity', ['foo', 1.2, None])
  162. def test_set_gravity_with_wrong_type(self, videogame_test, gravity):
  163. with pytest.raises(TypeError) as e:
  164. videogame_test.set_gravity(gravity)
  165. assert str(e.value) == 'the gravity must be an integer'
  166. def test_set_marks(self, videogame_test):
  167. videogame_test.set_marks()
  168. assert _globals.marks.x_color == settings.MARKS_DEFAULT_X_COLOR
  169. assert _globals.marks.y_color == settings.MARKS_DEFAULT_Y_COLOR
  170. assert _globals.marks.width == settings.MARKS_DEFAULT_WIDTH
  171. """
  172. def test_prepare_02_yaml(self, videogame_test):
  173. videogame_test.prepare('02.yaml')
  174. def test_load_yaml_with_no_characters(self, videogame_test):
  175. videogame_test.prepare('no_characters.yaml')
  176. def test_update(self, videogame_test):
  177. videogame_test.update()
  178. """