33
44
55try :
6- from classes import new_aliens_collection
7- except ImportError as err :
8- raise ImportError ("We tried to import the new_aliens_collection() function, "
9- "but could not find it. Did you remember to create it?" ) from err
6+ from classes import Alien
7+ except ImportError as import_fail :
8+ # pylint: disable=raise-missing-from
9+ raise ImportError ("\n \n MISSING CLASS --> We tried to import the 'Alien' class from "
10+ "your classes.py file, but could not find it."
11+ "Did you misname or forget to create it?" ) from None
1012
1113try :
12- from classes import Alien
14+ from classes import new_aliens_collection
1315except ImportError as err :
14- raise ImportError ("We tried to import the 'Alien' class from the classes.py file, but could not find it. "
15- "Did you remember to create it?" ) from err
16+ raise ImportError ("\n \n MISSING FUNCTION --> We tried to import the "
17+ "new_aliens_collection() function "
18+ "from your classes.py file, but could not find it. "
19+ "Did you misname or forget to create it?" ) from None
1620
1721
1822class ClassesTest (unittest .TestCase ):
19- # Test Alien class exists and correctly initialised.
23+
2024 @pytest .mark .task (taskno = 1 )
2125 def test_alien_has_correct_initial_coordinates (self ):
26+ """Test thst the Alien class gets correctly initialised."""
27+
2228 alien = Alien (2 , - 1 )
23- error = ("Expected object to be at position (2, -1) but instead "
24- f"found it initialized to position { (alien .x_coordinate , alien .y_coordinate )} ." )
29+ error_message = (f'Created a new Alien by calling Alien(2, -1). '
30+ f'The Alien was initialized to position '
31+ f'{ (alien .x_coordinate , alien .y_coordinate )} , but the tests expected '
32+ f'the object to be at position (2, -1)' )
2533
26- self .assertEqual ((2 , - 1 ), (alien .x_coordinate , alien .y_coordinate ), msg = error )
34+ self .assertEqual ((2 , - 1 ), (alien .x_coordinate , alien .y_coordinate ), msg = error_message )
2735
2836 @pytest .mark .task (taskno = 1 )
2937 def test_alien_has_health (self ):
3038 alien = Alien (0 , 0 )
31- error = ("Expected object's health to be 3 but instead found "
32- f"it had a health of { alien .health } ." )
39+ error_message = (f'Created a new Alien by calling Alien(0, 0). '
40+ f'The new Alien has a health of { alien .health } , '
41+ f'but the tests expect health = 3' )
3342
34- self .assertEqual (3 , alien .health , msg = error )
43+ self .assertEqual (3 , alien .health , msg = error_message )
3544
36- # Test instance variables are unique to specific instances.
3745 @pytest .mark .task (taskno = 1 )
3846 def test_alien_instance_variables (self ):
47+ """Test instance variables are unique to specific instances."""
48+
3949 alien_one = Alien (- 8 , - 1 )
4050 alien_two = Alien (2 , 5 )
4151
42- coord_x_error = ("Expected alien_one and alien_two to have different x "
43- f"positions. Instead both x's were: { alien_two .x_coordinate } ." )
44- coord_y_error = ("Expected alien_one and alien_two to have different y "
45- f"positions. Instead both y's were: { alien_two .y_coordinate } ." )
52+ coord_x_error = (f'Created two new Aliens by assigning '
53+ f'alien_one = Alien(-8, -1) and alien_two = Alien(2, 5). '
54+ f'Both Aliens x coordinates were { alien_two .x_coordinate } , '
55+ f'but the tests expect alien_one and alien_two to have '
56+ f'different x positions.' )
57+
58+ coord_y_error = (f'Created two new Aliens by assigning '
59+ f'alien_one = Alien(-8, -1) and alien_two = Alien(2, 5). '
60+ f'Both Aliens y coordinates were { alien_two .y_coordinate } , '
61+ f'but the tests expect alien_one and alien_two to have '
62+ f'different y positions.' )
4663
4764 self .assertFalse (alien_one .x_coordinate == alien_two .x_coordinate , msg = coord_x_error )
4865 self .assertFalse (alien_one .y_coordinate == alien_two .y_coordinate , msg = coord_y_error )
4966
50- # Test class methods work as specified.
67+
5168 @pytest .mark .task (taskno = 2 )
5269 def test_alien_hit_method (self ):
53- #There are two valid interpretations for this method/task.
54- #`self.health -= 1` and `self.health = max(0, self.health - 1)`
55- #The tests for this task reflect this ambiguity.
70+ """Test class methods work as specified.
71+
72+ There are two valid interpretations for this method/task.
73+ `self.health -= 1` and `self.health = max(0, self.health - 1)`
74+ The tests for this task reflect this ambiguity.
5675
57- data = [(1 , (2 ,)), (2 , (1 ,)), (3 , (0 ,)), (4 , (0 , - 1 )), (5 , (0 , - 2 )), (6 , (0 , - 3 ))]
58- for variant , (iterations , result ) in enumerate (data , 1 ):
76+ """
77+
78+ test_data = [1 , 2 , 3 , 4 , 5 , 6 ]
79+ result_data = [(2 ,), (1 ,), (0 ,), (0 , - 1 ), (0 , - 2 ), (0 , - 3 )]
80+
81+ for variant , (iterations , expected ) in enumerate (zip (test_data , result_data ), start = 1 ):
5982 alien = Alien (2 , 2 )
60- with self .subTest (f'variation #{ variant } ' , input = iterations , output = result ):
61- error = ("Expected hit method to decrement health by 1. "
62- f"Health is { alien .health } when it should be { result } ." )
83+
84+ with self .subTest (f'variation #{ variant } ' ,
85+ iterations = iterations ,
86+ expected = expected ):
87+
6388 for _ in range (iterations ):
6489 alien .hit ()
65- self .assertIn (alien .health , result , msg = error )
90+
91+ error_message = (f'Called hit() { iterations } time(s) '
92+ f'on a newly created Alien. The Aliens health '
93+ f'is now { alien .health } , but the tests expected '
94+ f'it to be in { expected } after decrementing 1 health '
95+ f'point { iterations } time(s).' )
96+
97+ self .assertIn (alien .health , expected , msg = error_message )
6698
6799
68100 @pytest .mark .task (taskno = 3 )
69101 def test_alien_is_alive_method (self ):
70102 alien = Alien (0 , 1 )
71- alive_error = "Alien is dead while health is greater than 0."
72- dead_error = "Alien is alive while health is less than or equal to 0."
103+
104+ alive_error = ('Created a new Alien and called hit(). '
105+ 'The function is_alive() is returning False (dead) '
106+ 'while alien.health is greater than 0.' )
107+
108+ dead_error = ('Created a new Alien and called hit(). '
109+ 'The function is_alive() is returning True (alive) '
110+ 'while alien.health is less than or equal to 0.' )
73111
74112 for _ in range (5 ):
75113 alien .hit ()
@@ -83,70 +121,92 @@ def test_alien_teleport_method(self):
83121 alien = Alien (0 , 0 )
84122 alien .teleport (- 1 , - 4 )
85123
86- error = (
87- "Expected alien to be at position (-1, -4) but "
88- f"instead found it in position { (alien .x_coordinate , alien .y_coordinate )} ." )
124+ error_message = ('Called alien.teleport(-1,-4) on a newly created Alien. '
125+ 'The Alien was found at position '
126+ f'{ (alien .x_coordinate , alien .y_coordinate )} , but the '
127+ 'tests expected it at position (-1, -4).' )
89128
90- self .assertEqual ((- 1 , - 4 ), (alien .x_coordinate , alien .y_coordinate ), msg = error )
129+ self .assertEqual ((- 1 , - 4 ), (alien .x_coordinate , alien .y_coordinate ), msg = error_message )
91130
92131 @pytest .mark .task (taskno = 5 )
93132 def test_alien_collision_detection_method (self ):
94133 alien = Alien (7 , 3 )
95- error = "Expected collision_detection method to not be implemented."
134+ error_message = ('Created a new Alien at (7,3) and called '
135+ 'alien.collision_detection(Alien(7, 2)). '
136+ f'The method returned { alien .collision_detection (Alien (7 , 2 ))} , '
137+ 'but the tests expected None. ' )
138+
139+ self .assertIsNone (alien .collision_detection (Alien (7 , 2 )), msg = error_message )
96140
97- self .assertIsNone (alien .collision_detection (Alien (7 , 2 )), msg = error )
98141
99- # Test class variables are identical across instances
100142 @pytest .mark .task (taskno = 6 )
101143 def test_alien_class_variable (self ):
102- alien_one = Alien (0 , 2 )
103- alien_two = Alien (- 6 , - 1 )
104- Alien .total_aliens_created = - 2
144+ """Test class attribute/variables are identical across instances."""
145+
146+ alien_one , alien_two = Alien (0 , 2 ), Alien (- 6 , - 1 )
147+ Alien .health = 6
105148
106- error_one = "Expected the total_aliens_created variable to be identical."
107- error_two = "Expected the health variable to be identical."
149+ created_error_message = ('Created two new Aliens and requested the '
150+ 'total_aliens_created attribute for each one. '
151+ f'Received { alien_one .total_aliens_created , alien_two .total_aliens_created } '
152+ f'for total_aliens_created, but the tests expect '
153+ f'the class attributes for each newly created Alien to be identical. ' )
108154
109- self .assertEqual (alien_two .total_aliens_created , alien_one .total_aliens_created , msg = error_one )
110- self .assertEqual (alien_two .health , alien_one .health , msg = error_two )
155+ health_error_message = ('Created two new Aliens and requested the '
156+ f'health attribute for each one. Received { alien_one .health , alien_two .health } '
157+ 'for health, but the tests expect the class '
158+ 'attributes for each newly created Alien to be identical. ' )
159+
160+ self .assertEqual (alien_two .total_aliens_created ,
161+ alien_one .total_aliens_created ,
162+ msg = created_error_message )
163+
164+ self .assertEqual (alien_two .health ,
165+ alien_one .health ,
166+ msg = health_error_message )
111167
112- # Test total_aliens_created increments upon object instantiation
113168 @pytest .mark .task (taskno = 6 )
114169 def test_alien_total_aliens_created (self ):
170+ """Test total_aliens_created class variable increments upon object instantiation."""
171+
115172 Alien .total_aliens_created = 0
116173 aliens = [Alien (- 2 , 6 )]
117- error = ("Expected total_aliens_created to equal 1. Instead "
118- f"it equals: { aliens [0 ].total_aliens_created } ." )
119174
120- self .assertEqual (1 , aliens [0 ].total_aliens_created , msg = error )
175+ error_message = ('Created a new Alien and called total_aliens_created for it. '
176+ f'{ aliens [0 ].total_aliens_created } was returned, but '
177+ 'the tests expected that total_aliens_created would equal 1.' )
178+
179+ self .assertEqual (1 , aliens [0 ].total_aliens_created , msg = error_message )
121180
122181 aliens .append (Alien (3 , 5 ))
123182 aliens .append (Alien (- 5 , - 5 ))
124183
125184 def error_text (alien , variable ):
126- return (
127- "Expected all total_aliens_created variables to be "
128- " equal to number of alien instances (i.e. 3). Alien "
129- f"number { alien } 's total_aliens_created variable "
130- f"is equal to { variable } ." )
185+ return ('Created two additional Aliens for the session.'
186+ f"Alien number { alien } 's total_aliens_created variable "
187+ f"is equal to { variable } , but the tests expected all "
188+ ' total_aliens_created variables for all instances to be '
189+ ' equal to number of alien instances created (i.e. 3).' )
131190
132- tac_list = [alien .total_aliens_created for alien in aliens ]
191+ self .assertEqual (3 , aliens [0 ].total_aliens_created , msg = error_text (1 , aliens [0 ]))
192+ self .assertEqual (3 , aliens [1 ].total_aliens_created , msg = error_text (2 , aliens [1 ]))
193+ self .assertEqual (3 , aliens [2 ].total_aliens_created , msg = error_text (3 , aliens [2 ]))
133194
134- self .assertEqual (3 , tac_list [0 ], msg = error_text (1 , tac_list [0 ]))
135- self .assertEqual (3 , tac_list [1 ], msg = error_text (2 , tac_list [1 ]))
136- self .assertEqual (3 , tac_list [2 ], msg = error_text (3 , tac_list [2 ]))
137-
138- # Test that the user knows how to create objects themselves
139195 @pytest .mark .task (taskno = 7 )
140196 def test_new_aliens_collection (self ):
141- position_data = [(- 2 , 6 ), (1 , 5 ), (- 4 , - 3 )]
142- obj_list = new_aliens_collection (position_data )
143- obj_error = "new_aliens_collection must return a list of Alien objects."
197+ """Test that the user knows how to create objects themselves."""
198+
199+ test_data = [(- 2 , 6 ), (1 , 5 ), (- 4 , - 3 )]
200+ actual_result = new_aliens_collection (test_data )
201+
202+ error_message = "new_aliens_collection() must return a list of Alien objects."
144203
145- for obj , position in zip ( obj_list , position_data ) :
146- self .assertIsInstance (obj , Alien , msg = obj_error )
204+ for obj in actual_result :
205+ self .assertIsInstance (obj , Alien , msg = error_message )
147206
148- pos_error = (
149- f"Expected object to be at position { position } but "
150- f"instead found it initialized to position { (obj .x_coordinate , obj .y_coordinate )} ." )
207+ for position , obj in zip (test_data , actual_result ):
208+ position_error = (f'After calling new_aliens_collection({ test_data } ), '
209+ f'found { obj } initialized to position { (obj .x_coordinate , obj .y_coordinate )} , '
210+ f'but the tests expected { obj } to be at position { position } instead.' )
151211
152- self .assertEqual (position , (obj .x_coordinate , obj .y_coordinate ), msg = pos_error )
212+ self .assertEqual (position , (obj .x_coordinate , obj .y_coordinate ), msg = position_error )
0 commit comments