def test_invalid_rebalance(self): """Test if API will accept playing an invalid action""" # create a new game created_game = self.client.get( '/game_board/api/start_game/Easy/ID1,ID2/AVL') # attempt to balance a balanced tree post_data = json.dumps({'adjacency_list': 'test'}) response = self.client.post('/game_board/api/rebalance/' + str(created_game.data['game_id']) + '/-1/-1', post_data, content_type='application/json') self.assertEqual( response.data, {'invalid_action': 'Tree is already balanced!'}, msg=f'{BColors.FAIL}\t[-]\tTree is already balanced!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass attempting to balance an already balanced tree.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def setUp(self): """Create an account and active game. Then save the games to the user's profile.""" sleep(1) # temporary user name self.user_info = str(uuid.uuid1()).split('-')[0] # Create the user post_data = {'user_name': self.user_info, 'password1': 'pineapple', 'password2': 'pineapple', 'email': self.user_info+"@gmail.com"} response_1 = self.client.post('/profile_page/api/register', post_data) self.assertEqual(response_1.status_code, 200, msg=f'{BColors.FAIL}\t[-]\tFailed creating an account!{BColors.ENDC}') print(f"{BColors.OKGREEN}\t[+]\tPass creating a user.{BColors.ENDC}") # Authentication token self.token = response_1.data['token'] # create a new game self.game_id = self.client.get('/game_board/api/start_game/Easy/ID1,ID2,ID3/AVL').data['game_id'] # Save the game to user 's profile post_data_save = {'user_id': self.user_info, 'game_id': self.game_id, 'token': self.token} response_save = self.client.post('/profile_page/api/save_board', post_data_save) self.assertEqual(response_save.status_code, 200, msg=f'{BColors.FAIL}\t[-]\tFailed saving a game!{BColors.ENDC}') print(f"{BColors.OKGREEN}\t[+]\tPass saving a game.{BColors.ENDC}") # remove the active games since we can't have the duplicate active games game_db.remove_game(self.game_id)
def tearDown(self): """Removes the testing user and game board from the database.""" # remove the user profile_db.remove_user(self.user_info) # remove the created games game_db.remove_game(self.game_id)
def test_forage(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function THIS WILL FAIL UNTIL I MEET WITH DAVID response = self.client.get('/game_board/temp-josh/forage/' + str(response.data['game_id']) + '/Easy/node1/node1') board = response.data # make sure there was an error since no chambers are there. self.assertEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was not 400!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[+]\tPass returning the correct response code.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_dig_chamber(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/temp-david/dig_chamber/' + str(response.data['game_id']) + '/node1/no') board = response.data # make sure there was an error because selected node does not exist self.assertEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was not 400!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[+]\tPass returning the correct response code.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_start_game(self): """Tests starting new games""" random.seed(42) fail = False print( f"{BColors.OKBLUE}\t[i]\tStarting 20 games and ending them...{BColors.ENDC}" ) for _ in range(20): try: # Create players difficulty = random.choice(config.DIFFICULTY_LEVELS) players = list() num_players = random.randint(1, 4) for _ in range(num_players): name = random.choice(string.ascii_letters) players.append("ID" + str(name)) players = ','.join(players) # Start a new game url = "/game_board/api/start_game/" + difficulty + '/' + players + '/AVL' response = self.client.get(url) self.assertEqual( response.status_code, 200, msg= f'{BColors.FAIL}\t[-]\tResponse was not 200!{BColors.ENDC}' ) self.assertIn( 'game_id', response.data.keys(), msg= f'{BColors.FAIL}\t[-]\tGame ID was not returned!{BColors.ENDC}' ) # Remove the test game from the database sleep(0.2) db.remove_game(response.data['game_id']) except Exception as err: print( f"{BColors.FAIL}\t[-]\tFail creating games: {BColors.ENDC}", str(err)) fail = True if not fail: print( f"{BColors.OKGREEN}\t[+]\tPass generating games.{BColors.ENDC}" )
def setUp(self): """ creates game data needed for tests """ self.board = { "game_id": "60afce36-085a-11eb-b6ab-acde48001122", "graph": { "nodes": "node4(node2(node3)(node1))(node6(node5))", "node_points": { "node1": 1, "node2": 2, "node3": 3, "node4": 4, "node5": 5, "node6": 6 }, "gold_node": "node5", "balanced": True }, "player_ids": ["id2", "id3", "id4", "id5"], "player_names": ["naomi", "kulsoom", "nick", "ryan"], "player_points": { "id2": 2, "id3": 2, "id4": 3, "id5": 10 }, "turn": "id2", "cards": { "id2": ["card1", "card2", "card3"], "id3": ["card1", "card2", "card3"], "id4": ["card1", "card2", "card3"], "id5": ["card1", "card2", "card3"] }, "gold_node": False, "difficulty": "Medium", "num_players": 4, "online": True, "curr_data_structure": "AVL", "selected_data_structures": ["AVL", "Stack"], "timed_game": False, "seconds_until_next_ds": 60, "time_created": "07/10/2020 00:05:47", "end_game": False } self.fail_phrase = 'nah bro idk about it' #Make sure the game is cleared out mongo.remove_game(self.board["game_id"])
def test_game_board_state(self): """Tests if the game configured as requested. Also tests load""" # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) board = response.data self.assertEqual( board['difficulty'], 'Easy', msg=f'{BColors.FAIL}\t[-]\tDifficulty does not match!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[load_board]\tPass choosing the difficulty level.{BColors.ENDC}" ) self.assertEqual( board['curr_data_structure'], 'LLIST', msg= f'{BColors.FAIL}\t[-]\tCurrent data structure is invalid!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[load_board]\tPass setting the data structure.{BColors.ENDC}" ) self.assertEqual( board['player_ids'], ['ID1lltest'], msg=f'{BColors.FAIL}\t[-]\tIncorrect user ID!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[load_board]\tPass choosing user ID.{BColors.ENDC}" ) self.assertEqual( board['total_food'], 6, msg=f'{BColors.FAIL}\t[-]\tStarting food is not 6!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[load_board]\tPass setting the starting food amount.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_invalid_player(self): """Test if API will let a non bot player know the AI move""" # create a new game created_game = self.client.get( '/game_board/api/start_game/Easy/ID1,ID2/AVL') # play invalid card response = self.client.get('/game_board/api/ai_pick/' + str(created_game.data['game_id']) + '/-1/-1') self.assertEqual( response.data, {'error': 'The current player is not a BOT'}, msg= f'{BColors.FAIL}\t[-]\tAllowed AI to make a move for a real player!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass attempting to let the AI make move as a real player.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_delete_correct(self): """ The document was deleted in the database """ deleted_game = mongo.remove_game( "60afce36-085a-11eb-b6ab-acde48001122") self.assertEqual( deleted_game, 1, msg= f'{BColors.FAIL}\t[-]\tDatabase was not able to delete the game!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass gameboard database delete.{BColors.ENDC}" )
def test_delete_nonexist(self): """ The document should not be deleted from the database """ deleted_game = mongo.remove_game( "This name should'nt exist in the database, and if it does, it deserves to be deleted" ) self.assertEqual( deleted_game, self.fail_phrase, msg= f'{BColors.FAIL}\t[-]\tIncorrect return for non-existant game!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass gameboard database delete nonexistant.{BColors.ENDC}" )
def update_board_db(board, user_id='-1', token='-1'): """ Update the game board in the database with the new state. Returns the board itself unless the game ended. If the game ended, then it changes the <end_game> field, and deletes the game from database. Otherwise, changes turn to the next player. :param board: game board :param user_id: username :param token: authentication token :return result, {'error': bool, 'reason': string, 'game_board': dict}: """ result = {'error': False, 'reason': '', 'game_board': board} try: if board['curr_data_structure'] == 'AVL': # Game ended if (board['graph']['root_node'] == board['graph']['gold_node'] or len(board['deck']) == 0): # update the board board['end_game'] = True board['turn'] = max( board['player_points'], key=board['player_points'].get) # get player w/ max points result['game_board'] = board # if user is authenticated if user_id not in ['-1', -1, '' ] and token not in ['-1', -1, '']: # check if the game is being loaded from profile page if 'profile_load' in list( board.keys()) and board['profile_load'] is False: # Here check if user_id matches the token with the database if profile_db.check_user(user_id, token): # Currently error return if user is not authenticated is disabled # It just not updates the score #result['error'] = True #result['reason'] = "User is not authenticated" #return result # if the user is in part of the players (paranoid check) if str(user_id) in board['player_ids']: # if not negative points if board['player_points'][str(user_id)] > 0: # get user's current points curr_points = profile_db.get_points( str(user_id)) # get the target points if user_id == board['turn']: # if the user is the winner, double the points target_points = curr_points + ( math.log(board['player_points'][ str(user_id)]) * 2) else: # don't double the points if the user is not the winner target_points = curr_points + math.log( board['player_points'][str( user_id)]) # set the new points profile_db.set_points( str(user_id), target_points) # remove the game from the database db.remove_game(board['game_id']) # Game continues else: _ = db.update_game(board['game_id'], board) # hide the UID used by data structure backend from user # del board['graph']['uid'] # Update result['game_board'] = board else: _ = db.update_game(board['game_id'], board) # hide the UID used by data structure backend from user # del board['graph']['uid'] # Update result['game_board'] = board except Exception as err: result['error'] = True result['reason'] = str(err) return result return result
def tearDown(self): """ Removes game data needed in tests """ mongo.remove_game(self.board["game_id"]) # Called in case purge fails mongo.remove_game(self.board2["game_id"])
def tearDown(self): """ Removes game data needed in tests """ mongo.remove_game(self.board["game_id"])
def test_dig_tunnel(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call move ant function, from surface -> chamber1 so that we can test digging a tunnel after chamber1 response = self.client.get('/game_board/llist_api/move_ant/' + str(response.data['game_id']) + '/surface/chamber1') # call dig tunnel response = self.client.get('/game_board/llist_api/dig_tunnel/' + str(response.data['game_id']) + '/chamber1/None') # make sure there was no error since we can now dig a tunnel self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400!{BColors.ENDC}') self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was 500!{BColors.ENDC}') self.assertNotEqual( response.status_code, 404, msg=f'{BColors.FAIL}\t[-]\tResponse was 404!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[dig_tunnel]\tPass returning the correct response code.{BColors.ENDC}" ) board = response.data # make sure time track was updated self.assertEqual( board['time_tracks']['dig_tunnel_track'], 35, msg= f'{BColors.FAIL}\t[-]\tTimetrack was not decremented!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_tunnel]\tPass updating dig tunnel time track.{BColors.ENDC}" ) # make sure chamber1 no longer has a tunnel going to the surface, but has one going no where. self.assertIsNone( board['graph']['chambers']['chamber1']['tunnels']['next'], msg= f'{BColors.FAIL}\t[-]\tchamber1\'s next tunnel not None!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_tunnel]\tPass changing tunnel from surface to tunnel leading no where.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_spawn(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) board = response.data # make sure there is no error self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tCould not spawn ant!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[spawn_ant]\tPass spawn ant api.{BColors.ENDC}" ) # make sure food was taken self.assertEqual( board['total_food'], 3, msg=f'{BColors.FAIL}\t[-]\tTotal food is off!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[spawn_ant]\tPass taking food after spawn.{BColors.ENDC}" ) # make sure ant total was updated self.assertEqual( board['total_ants'], 2, msg=f'{BColors.FAIL}\t[-]\tTotal ants are off!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[spawn_ant]\tPass creating a new ant.{BColors.ENDC}" ) # make sure ant was placed on surface self.assertEqual( board['total_surface_ants'], 2, msg=f'{BColors.FAIL}\t[-]\tNew ant not on surface!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['surface']['num_ants'], 2, msg= f'{BColors.FAIL}\t[-]\tnum_ants.surface not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[spawn_ant]\tPass placing ant on surface.{BColors.ENDC}" ) # make sure donut was taken self.assertEqual( board['total_food_types']['donut'], 0, msg=f'{BColors.FAIL}\t[-]\tDonut not taken!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[spawn_ant]\tPass taking a donut.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_fill_chamber(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call move ant function, from surface -> chamber1 so that we can test digging a tunnel after chamber1 response = self.client.get('/game_board/llist_api/move_ant/' + str(response.data['game_id']) + '/surface/chamber1') self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400!{BColors.ENDC}') # call dig tunnel response = self.client.get('/game_board/llist_api/dig_tunnel/' + str(response.data['game_id']) + '/chamber1/None') # call dig chamber function for tunnel that was just made response = self.client.get('/game_board/llist_api/dig_chamber/' + str(response.data['game_id']) + '/chamber1/no/None') response = self.client.get('/game_board/llist_api/fill_chamber/' + str(response.data['game_id']) + '/node1') # make sure there was an error because selected node does not exist self.assertEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was not 400!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[fill_chamber]\tPass returning the correct response code.{BColors.ENDC}" ) response = self.client.get('/game_board/llist_api/fill_chamber/' + str(created_game.data['game_id']) + '/chamber2') reason = ' ' if response.status_code == 400: reason = response.data['invalid_action'] self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400! {reason}{BColors.ENDC}' ) self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was 500!{BColors.ENDC}') self.assertNotEqual( response.status_code, 404, msg=f'{BColors.FAIL}\t[-]\tResponse was 404!{BColors.ENDC}') board = response.data self.assertNotIn( 'chamber2', board['graph']['chambers'], msg= f'{BColors.FAIL}\t[-]\tFailed to properly yeet chamber{BColors.ENDC}' ) self.assertEqual( board['graph']['chambers']['chamber1']['tunnels']['exit'], False, msg= f'{BColors.FAIL}\t[-]\tChamber 1 exit still exists{BColors.ENDC}') self.assertIsNone( board['graph']['chambers']['chamber1']['tunnels']['next'], msg= f'{BColors.FAIL}\t[-]\tChamber 1 next still exists{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[fill_chamber]\tPass removing chamber{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_dig_chamber(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call move ant function, from surface -> chamber1 so that we can test digging a tunnel after chamber1 response = self.client.get('/game_board/llist_api/move_ant/' + str(response.data['game_id']) + '/surface/chamber1') # call dig tunnel response = self.client.get('/game_board/llist_api/dig_tunnel/' + str(response.data['game_id']) + '/chamber1/None') # call dig chamber function for tunnel that was just made response = self.client.get('/game_board/llist_api/dig_chamber/' + str(response.data['game_id']) + '/chamber1/no/None') # Make sure that there was no error in function call self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400!{BColors.ENDC}') self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was 500!{BColors.ENDC}') self.assertNotEqual( response.status_code, 404, msg=f'{BColors.FAIL}\t[-]\tResponse was 404!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass returning the correct response code.{BColors.ENDC}" ) board = response.data # make sure time track was updated self.assertEqual( board['time_tracks']['dig/fill_chamber'], 35, msg= f'{BColors.FAIL}\t[-]\tTimetrack was not decremented!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass updating time tracks.{BColors.ENDC}" ) # Make sure the new chamber was put in the chamber list self.assertIn( 'chamber2', board['graph']['chambers'], msg= f'{BColors.FAIL}\t[-]\tChamber2 was not put in chamber list!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass putting chamber2 in chamber list.{BColors.ENDC}" ) # Make sure chamber2 is connected to chamber1 self.assertEqual( board['graph']['chambers']['chamber2']['tunnels']['prev'], 'chamber1', msg= f'{BColors.FAIL}\t[-]\tChamber2 is not connected to chamber1!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass connecting chambers with the tunnel.{BColors.ENDC}" ) # Make sure ant didn't leave chamber1 self.assertEqual( board['graph']['chambers']['chamber2']['num_ants'], 0, msg= f'{BColors.FAIL}\t[-]\tAnt was placed in chamber2!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['chamber1']['num_ants'], 1, msg= f'{BColors.FAIL}\t[-]\tAnt was move from chamber1!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass not moving the ant.{BColors.ENDC}" ) # Make sure total number of chambers was updated self.assertEqual( board['total_chambers'], 2, msg= f'{BColors.FAIL}\t[-]\tTotal number of chambers was not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[dig_chamber]\tPass updating number of chambers.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def tearDown(self): """remove the created game""" db.remove_game(self.game['game_id'])
def test_forage(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function so that we can test foraging with it response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call spawn ant function THIS WILL FAIL UNTIL I MEET WITH DAVID response = self.client.get('/game_board/llist_api/forage/' + str(response.data['game_id']) + '/Easy/chamber1') # make sure there was no error since we can now forage self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400!{BColors.ENDC}') self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was 500!{BColors.ENDC}') self.assertNotEqual( response.status_code, 404, msg=f'{BColors.FAIL}\t[-]\tResponse was 404!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[forage]\tPass returning the correct response code.{BColors.ENDC}" ) board = response.data # make sure time track was updated self.assertEqual( board['time_tracks']['move/forage'], 35, msg= f'{BColors.FAIL}\t[-]\tTimetrack was not decremented!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass updating time tracks.{BColors.ENDC}" ) # make sure number of surface ants were updated (only queen should on surface) self.assertEqual( board['total_surface_ants'], 1, msg=f'{BColors.FAIL}\t[-]\tAnt still on surface!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['surface']['num_ants'], 1, msg= f'{BColors.FAIL}\t[-]\tnum_ants.surface not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass taking ant off of surface.{BColors.ENDC}" ) # make sure ant was placed in chamber1 self.assertEqual( board['graph']['chambers']['surface']['num_ants'], 1, msg= f'{BColors.FAIL}\t[-]\tAnt was not placed in chamber1!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass placing ant in chamber1.{BColors.ENDC}" ) # make sure that we can assert the correct things if under attack if board['graph']['chambers']['chamber1']['under_attack']: # make sure number of surface ants were updated (only queen should on surface) self.assertTrue( board['graph']['chambers']['chamber1']['under_attack'], msg= f'{BColors.FAIL}\t[-]\tUnder attack was not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass being able to come under attack.{BColors.ENDC}" ) elif board['graph']['chambers']['chamber1']['food']['crumb'] >= 2: # make sure number of surface ants were updated (only queen should on surface) self.assertEqual( board['graph']['chambers']['chamber1']['food']['crumb'], 2, msg= f'{BColors.FAIL}\t[-]\tcrumb was placed in chamber but too many crumbs!{BColors.ENDC}' ) self.assertEqual( board['total_food_types']['crumb'], 2, msg= f'{BColors.FAIL}\t[-]\ttotal_food_types was not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass being able to forage for a crumb.{BColors.ENDC}" ) # make sure total_food was updated self.assertEqual( board['total_food'], 4, msg=f'{BColors.FAIL}\t[-]\ttotal_food is off!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[forage]\tPass updating total_food.{BColors.ENDC}" ) elif board['graph']['chambers']['chamber1']['food']['berry'] >= 2: # make sure number of surface ants were updated (only queen should on surface) self.assertEqual( board['graph']['chambers']['chamber1']['food']['berry'], 2, msg= f'{BColors.FAIL}\t[-]\tberry was placed in chamber but too many berries!{BColors.ENDC}' ) self.assertEqual( board['total_food_types']['berry'], 2, msg= f'{BColors.FAIL}\t[-]\ttotal_food_types was not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass being able to forage for a berry.{BColors.ENDC}" ) # make sure total_food was updated self.assertEqual( board['total_food'], 5, msg=f'{BColors.FAIL}\t[-]\ttotal_food is off!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[forage]\tPasss updating total_food.{BColors.ENDC}" ) elif board['graph']['chambers']['chamber1']['food']['donut'] >= 2: # make sure number of surface ants were updated (only queen should on surface) self.assertEqual( board['graph']['chambers']['chamber1']['food']['donut'], 2, msg= f'{BColors.FAIL}\t[-]\tdonut was placed in chamber but too many crumbs!{BColors.ENDC}' ) self.assertEqual( board['total_food_types']['donut'], 2, msg= f'{BColors.FAIL}\t[-]\ttotal_food_types was not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[forage]\tPass being able to forage for a donut.{BColors.ENDC}" ) # make sure total_food was updated self.assertEqual( board['total_food'], 6, msg=f'{BColors.FAIL}\t[-]\ttotal_food is off!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[forage]\tPasss updating total_food.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_move_food(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call move ant function, from surface -> chamber1 so that we can moving food from chamber1 to chamber 2 response = self.client.get('/game_board/llist_api/move_ant/' + str(response.data['game_id']) + '/surface/chamber1') # call dig tunnel response = self.client.get('/game_board/llist_api/dig_tunnel/' + str(response.data['game_id']) + '/chamber1/None') # call dig chamber function for tunnel that was just made response = self.client.get('/game_board/llist_api/dig_chamber/' + str(response.data['game_id']) + '/chamber1/no/None') # call move food function response = self.client.get('/game_board/llist_api/move_food/' + str(response.data['game_id']) + '/chamber1/chamber2') # make sure there was no error since we can now forage thing = ' ' if response.status_code == 400: thing = response.data['invalid_action'] self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was 400! {thing}{BColors.ENDC}' ) self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was 500!{BColors.ENDC}') self.assertNotEqual( response.status_code, 404, msg=f'{BColors.FAIL}\t[-]\tResponse was 404!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[move_food]\tPass returning the correct response code.{BColors.ENDC}" ) board = response.data # make sure time track was updated self.assertEqual( board['time_tracks']['move/forage'], 34, msg= f'{BColors.FAIL}\t[-]\tTimetrack was not decremented!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[move_food]\tPass updating time tracks.{BColors.ENDC}" ) # Make sure chamber1 is updated correctly self.assertEqual( board['graph']['chambers']['chamber1']['food']['berry'], 0, msg=f'{BColors.FAIL}\t[-]\tBerry still in chamber1!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['chamber1']['food']['donut'], 0, msg= f'{BColors.FAIL}\t[-]\tChamber1 total not updated!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[move_food]\tPass moving food from chamber1.{BColors.ENDC}" ) # Make sure chamber2 is updated correctly self.assertEqual( board['graph']['chambers']['chamber2']['food']['berry'], 1, msg=f'{BColors.FAIL}\t[-]\tBerry still in chamber1!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['chamber2']['food']['total'], 2, msg= f'{BColors.FAIL}\t[-]\tChamber2 total not updated!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[move_food]\tPass moving food from chamber1.{BColors.ENDC}" ) # make sure total food didn't change nor total food types. self.assertEqual( board['total_food'], 3, msg=f'{BColors.FAIL}\t[-]\tTotal Food Changed!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[move_food]\tPass not changing total food.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_game_board_state(self): """Tests if the game configured as requested""" # create a new game created_game = self.client.get( '/game_board/api/start_game/Easy/ID1,ID2/AVL') # load the game response = self.client.get('/game_board/api/board/' + str(created_game.data['game_id'])) board = response.data self.assertEqual( board['difficulty'], 'Easy', msg=f'{BColors.FAIL}\t[-]\tDifficulty does not match!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass choosing the difficulty level.{BColors.ENDC}" ) self.assertEqual( board['curr_data_structure'], 'AVL', msg= f'{BColors.FAIL}\t[-]\tCurrent data structure is invalid!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass setting the data structure.{BColors.ENDC}" ) self.assertIn( board['turn'], ['ID1', 'ID2'], msg= f'{BColors.FAIL}\t[-]\tTurn is assigned to a non existing user!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass choosing the player turn.{BColors.ENDC}" ) self.assertEqual( board['player_ids'], ['ID1', 'ID2'], msg=f'{BColors.FAIL}\t[-]\tIncorrect user ID(s)!{BColors.ENDC}') print(f"{BColors.OKGREEN}\t[+]\tPass choosing user IDs.{BColors.ENDC}") self.assertIsNot( board['graph']['gold_node'], board['graph']['root_node'], msg= f'{BColors.FAIL}\t[-]\tGolden node and root node are same!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[+]\tPass choosing the nodes so that golden node is not at the root.{BColors.ENDC}" ) self.assertEqual( board['graph']['balanced'], True, msg= f'{BColors.FAIL}\t[-]\tInitial tree is unbalanced!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[+]\tPass balancing the initial tree.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])
def test_move_ant(self): # create a new game created_game = self.client.get( '/game_board/llist_api/start_game/Easy/ID1lltest/LLIST') # load the game response = self.client.get('/game_board/llist_api/board/' + str(created_game.data['game_id'])) # call spawn ant function so that we can test moving it response = self.client.get('/game_board/llist_api/spawn_ant/' + str(response.data['game_id'])) # call move ant function, from surface -> chamber1 response = self.client.get('/game_board/llist_api/move_ant/' + str(response.data['game_id']) + '/surface/chamber1') board = response.data # make sure time track was updated self.assertEqual( board['time_tracks']['move/forage'], 35, msg= f'{BColors.FAIL}\t[-]\tTimetrack was not decremented!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[move_ant]\tPass updating time tracks.{BColors.ENDC}" ) # make sure no error, bc you should be able to move the ant from surface to the chamber1 self.assertNotEqual( response.status_code, 400, msg=f'{BColors.FAIL}\t[-]\tResponse was not 400!{BColors.ENDC}') self.assertNotEqual( response.status_code, 500, msg=f'{BColors.FAIL}\t[-]\tResponse was not 500!{BColors.ENDC}') print( f"{BColors.OKGREEN}\t[move_ant]\tPass returning the correct response code.{BColors.ENDC}" ) # make sure number of surface ants were updated (only queen on surface) self.assertEqual( board['total_surface_ants'], 1, msg=f'{BColors.FAIL}\t[-]\tAnt still on surface!{BColors.ENDC}') self.assertEqual( board['graph']['chambers']['surface']['num_ants'], 1, msg= f'{BColors.FAIL}\t[-]\tnum_ants.surface not updated!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[move_ant]\tPass taking ant off of surface.{BColors.ENDC}" ) # make sure ant was placed in chamber1 self.assertEqual( board['graph']['chambers']['chamber1']['num_ants'], 1, msg= f'{BColors.FAIL}\t[-]\tAnt was not placed in chamber1!{BColors.ENDC}' ) print( f"{BColors.OKGREEN}\t[move_ant]\tPass placing ant in the cmahber.{BColors.ENDC}" ) # remove the created game sleep(0.2) db.remove_game(created_game.data['game_id'])