def test_is_promotion(self):
        expected = (True,'a8','Q')
        actual =  cm.is_promotion('a8=Q')
        self.assertEqual(expected,actual)

        expected = (False,'a8','')
        actual =  cm.is_promotion('a8')
        self.assertEqual(expected,actual)
    def parse_user_move(self, input_move):
        # TODO: Handle draws (50+ moves without exchange, or same state repeated 3 times)

        input_move = input_move.strip()

        if self.has_quit(input_move):
            return False

        if len(input_move)>1 and cm.is_check(input_move):
            input_move = input_move[:-1]

        if not validator.is_user_move_valid(input_move):
            return True

        promotion,input_move,promoted_to = cm.is_promotion(input_move)

        move_to_col,move_to_line,col_filter,line_filter = input_parser.parse_coordinates(input_move)
        
        parallel_board = copy.deepcopy(self.board)
        accepted_move = self.move_piece_to(input_move, move_to_col, move_to_line, col_filter, line_filter)

        if promotion:
            self.board.promote( move_to_col, move_to_line, self.player, promoted_to )

        if self.board.Rules.is_king_under_attack(self.board,self.player):
            print "Cannot leave %s player in check!"%self.player
            accepted_move = False
            self.board = parallel_board

        if accepted_move:
            self.print_move(input_move, move_to_col, move_to_line)

            if self.is_match() and self.hit_endgame():
                return False
            else:
                self.switch_player()
        
        if cm.is_special_case(input_move):
                self.restart()
        return True
def is_user_move_valid(input_move):
    if len(input_move) <= 1:
        print 'wrong input try again'
        return False

    if cm.is_check(input_move):
        print "CHECK"
        input_move = input_move[:-1]

    if cm.is_castling(input_move):
        return True

    if cm.is_special_case(input_move):
        return True

    if not cm.is_pawn(input_move) and not cm.is_main_piece(input_move):
        print 'case not valid, not a chess piece'
        return False

    if validate_eat_case(input_move):
        print 'valid eat input'
        return True

    if validate_move_case(input_move):
        print 'valid move input'
        return True

    promotion,input_move,promoted_to = cm.is_promotion(input_move)

    if promotion:
        if not is_valid_promotion(input_move,promoted_to):
            return False
        else:
            return True

    print 'wrong input, try again'
    return False