private void test_trap(GameState game, int trap_id) {

    // Get some working variables
    long enemy_bb = game.colour_bb[game.enemy];
    long player_bb = game.colour_bb[game.player];
    int steps_available = game.getStepsRemaining();

    // Case 1: There is an epiece on the trap

    // I believe this case is complete!
    if ((enemy_bb & TRAP[trap_id]) != 0) {

      // By Definition an epiece must be touching trap
      long e_touch_bb = game.colour_bb[game.enemy] & TOUCH_TRAP[trap_id];
      int e_touch = Util.PopCnt(e_touch_bb);

      // Try and drag the epieces away with an already touching piece
      if (steps_available >= e_touch * 2) {
        try_drag_moves(game, e_touch_bb, FULL_BB, trap_id);
      }

      // Try and move a dominant piece next to the epiece touching the trap
      int extra_steps = steps_available - 2 * e_touch;
      if (extra_steps >= 1) {

        // Given: there is only 1 epiece touching the trap
        // Given: there is no epiece on the trap
        // The precondition check catches 2 non dominant pieces touching trap
        assert (Util.PopCnt(e_touch_bb) == 1);
        assert ((enemy_bb & TRAP[trap_id]) != 0);

        // Get the enemy piece type
        int e_piece_type = game.getPieceType(e_touch_bb);

        long p_dest_bb = game.touching_bb(e_touch_bb);
        long p_stronger_bb = game.stronger_enemy_bb[e_piece_type];

        // Try moving a dominant piece next to the epiece
        try_two_steps(game, p_stronger_bb, p_dest_bb, trap_id, extra_steps);

      }

    }

    // Case 2: There is no epiece on the trap AND
    // there are epiece(s) touching the trap

    // I believe this case is complete!
    // TODO algorithm misses player suiciding his piece on the trap.
    else if ((enemy_bb & TOUCH_TRAP[trap_id]) != 0) {

      // By Definition an epiece must be touching trap
      long e_touch_bb = game.colour_bb[game.enemy] & TOUCH_TRAP[trap_id];
      int e_touch = Util.PopCnt(e_touch_bb);

      // Try and drag an epiece onto the trap
      // Only works if there are at least 2 steps available
      if (steps_available >= 2) {
        long e_start_bb = TOUCH_TRAP[trap_id];
        long e_dest_bb = TRAP[trap_id];
        try_drag_moves(game, e_start_bb, e_dest_bb, trap_id);
      }

      // Try and move a dominant piece next to the epiece touching the trap
      int extra_steps = steps_available - 2 * e_touch;
      if (extra_steps >= 1) {

        // Given: there is only 1 epiece touching the trap
        // Given: there is no epiece on the trap
        // The precondition check catches 2 non dominant pieces touching trap
        assert (Util.PopCnt(e_touch_bb) == 1);
        assert ((enemy_bb & TRAP[trap_id]) == 0);

        // Get the enemy piece type
        int e_piece_type = game.getPieceType(e_touch_bb);

        long p_dest_bb = touching_bb(e_touch_bb);
        long p_stronger_bb = game.stronger_enemy_bb[e_piece_type];

        // Try moving a dominant piece next to the epiece
        try_two_steps(game, p_stronger_bb, p_dest_bb, trap_id, extra_steps);

      }

    }

    // Case 3: There is no epiece on the trap AND
    // there is no epiece touching the trap AND
    // there are epiece(s) 2 steps from the trap

    // THIS CASE IS COMPLETE!!!!!
    else if ((enemy_bb & TOUCH2_TRAP[trap_id]) != 0) {

      // Try and drag an epiece closer to the trap
      // Only works if there are at least 4 steps available
      if (steps_available >= 4) {
        long e_start_bb = TOUCH2_TRAP[trap_id];
        long e_dest_bb = TOUCH_TRAP[trap_id];
        try_drag_moves(game, e_start_bb, e_dest_bb, trap_id);
      }
    }

  }