Exemplo n.º 1
0
def test_ocr_valu8():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_src'], '1.png'))
    table_scraper.crop_from_top_left_corner2(select_table=0)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()

    pytest.assume(table_scraper.total_pot == 12.5)
    pytest.assume(
        table_scraper.player_funds == [23.0, 100.0, 42.0, 23.0, 97.5,
                                       102.0])  # pass
    pytest.assume(
        table_scraper.player_pots == [-1.0, -1.0, 6.0, -1.0, -1.0,
                                      -1.0])  # Ghost number
Exemplo n.º 2
0
def test_is_my_turn():  ## ok!!!
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    test_src = os.environ['test_src']
    table_scraper = TableScraper(table_dict)
    table_scraper.screenshot = Image.open(os.path.join(test_src, '1.PNG'))
    table_scraper.crop_from_top_left_corner2(select_table=0)
    screenshot = table_scraper.crop_from_top_left_corner()

    status = is_template_in_search_area(table_dict, screenshot,
                               'my_turn', 'my_turn_search_area', table_scraper.scale_defaults)
    log.debug(is_template_in_search_area(table_dict, screenshot,
                               'my_turn', 'my_turn_search_area', table_scraper.scale_defaults))
    #
    search_area = table_dict['my_turn_search_area']
    template = table_dict['my_turn']
    template_cv2 = binary_pil_to_cv2(template)
    cropped_screenshot = screenshot.crop((search_area['x1'], search_area['y1'], search_area['x2'], search_area['y2']))
    screenshot_cv2 = pil_to_cv2(cropped_screenshot)

    # plt.imshow(cropped_screenshot, cmap='gray', interpolation='bicubic')   # ok!
    # plt.imshow(template_cv2, cmap='gray', interpolation='bicubic')
    # plt.show()
    assert status == True
Exemplo n.º 3
0
def test_ocr_valu10():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_src'], '1.png'))
    table_scraper.crop_from_top_left_corner2(select_table=3)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    log.info(f"{table_scraper.total_pot}")
    log.info(f"{table_scraper.player_funds}")
    log.info(f"{table_scraper.player_pots}")
    pytest.assume(table_scraper.total_pot == 5.0)  # 73.0
    pytest.assume(table_scraper.player_funds == [
        25.0, 11.0, 98.0, 188.5, 50.5, 100.0
    ])  # [29.0, 6.0, 98.0, 108.9, 30.5, 10.0]
    pytest.assume(table_scraper.player_pots == [
        -1.0, -1.0, 2.0, 2.0, 1.0, -1.0
    ])  # [-1.0, -1.0, 25.0, -1.0, 1.0, -1.0]
Exemplo n.º 4
0
def get_table_template_image(table_name='default', label='topleft_corner'):
    """Load template from mongodb as cv2 image"""
    mongo = MongoManager()
    table = mongo.get_table(table_name=table_name)
    template_pil = Image.open(io.BytesIO(table[label]))
    template_cv2 = cv2.cvtColor(np.array(template_pil), cv2.COLOR_BGR2RGB)
    return template_cv2
Exemplo n.º 5
0
def test_ocr_valu22():  # ok
    # init_logger(screenlevel=logging.DEBUG, filename='test-ocr', logdir='log')
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_test'], '2.png'))
    table_scraper.crop_from_top_left_corner2(select_table=3)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    log.info(f"{table_scraper.total_pot}")
    log.info(f"{table_scraper.player_funds}")
    log.info(f"{table_scraper.player_pots}")
    pytest.assume(table_scraper.total_pot == 12.5)
    pytest.assume(
        table_scraper.player_funds == [154.0, 104.5, 90.0, 95.0, 20.0, 190.0])
    pytest.assume(table_scraper.player_pots == [
        2.0, 0.5, 10.0, -1.0, -1.0, -1.0
    ])  # [2.0, 0.5, 10.0, -1.0, 4.0, -1.0]
Exemplo n.º 6
0
def test_ocr_valu36():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_test'], '5.png'))
    table_scraper.crop_from_top_left_corner2(select_table=2)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    log.info(f"{table_scraper.total_pot}")
    log.info(f"{table_scraper.player_funds}")
    log.info(f"{table_scraper.player_pots}")
    pytest.assume(table_scraper.total_pot == 12.0)
    pytest.assume(
        table_scraper.player_funds == [145.5, 100.0, 20.0, 18.0, 187.5, 94.5])
    pytest.assume(
        table_scraper.player_pots == [-1.0, -1.0, -1.0, -1.0, -1.0, -1.0])
Exemplo n.º 7
0
def test_table_and_my_cards2():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_src'], '6.png'))
    table_scraper.crop_from_top_left_corner2(select_table=0)
    table_scraper.is_my_turn()
    table_scraper.lost_everything()
    table_scraper.get_my_cards2()
    table_scraper.get_table_cards2()
    table_scraper.get_dealer_position2()
    table_scraper.get_players_in_game()
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    table_scraper.get_call_value()
    table_scraper.get_raise_value()
    # table_scraper.has_all_in_call_button()
    table_scraper.has_call_button()
    table_scraper.has_raise_button()

    assert set(table_scraper.my_cards) == set(['JH', '4C'])  # ok
    assert table_scraper.player_funds == [39.5, 197.5, 36.0, 102.5, '', 100.0]
    assert table_scraper.player_pots == ['', 0.5, 1.0, '', '', '']
Exemplo n.º 8
0
def test_ocr_valu6():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_src1'], '9.png'))
    table_scraper.crop_from_top_left_corner2(select_table=0)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    log.info(f"{table_scraper.total_pot}")
    log.info(f"{table_scraper.player_funds}")
    log.info(f"{table_scraper.player_pots}")
    # assert table_scraper.total_pot == 4
    pytest.assume(table_scraper.total_pot == 4.0)  # 0.4 == 4.0 capture err
    pytest.assume(
        table_scraper.player_funds == [16.5, 23.5, 225.0, 65.5, 101.5, 100.0])
    pytest.assume(
        table_scraper.player_pots == [-1.0, 0.5, 1.0, 2.5, -1.0, -1.0])
Exemplo n.º 9
0
def test_4ocr_valu44():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)
    file_name = get_dir(os.path.join('log', 'pics', 'table_b_16.png'))

    table_scraper.screenshot = Image.open(file_name)
    # table_scraper.crop_from_top_left_corner2(select_table=0)
    if is_debug:
        # table_scraper.screenshot.save('log/pics/table1.png')
        file_name = get_dir(os.path.join('log', 'pics', 'table_label.png'))
        save_table_rectangle_cv2(table_scraper.screenshot, table_dict,
                                 file_name)
    table_scraper.get_pots()
    table_scraper.get_players_funds()
    table_scraper.get_player_pots()
    log.info(f"{table_scraper.total_pot}")
    log.info(f"{table_scraper.current_round_pot}")
    log.info(f"{table_scraper.player_funds}")
    log.info(f"{table_scraper.player_pots}")
    # pytest.assume(table_scraper.total_pot == 4.0)
    # assert table_scraper.total_pot == 4.0
    # pytest.assume(table_scraper.player_pots == [-1.0, -1.0, -1.0, 0.5, -1.0, 1.0])
    pytest.assume(table_scraper.current_round_pot == 2.0)
Exemplo n.º 10
0
def test_table_preflop_zenith():
    # tlc = get_table_tlc()
    # Init table function
    p = StrategyHandler()
    p.read_strategy()
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    gui_signals = MagicMock()
    gui_signals.select_table = 0  # select table
    game_logger = MagicMock()
    version = 4.21
    SB = 0.5
    prefix = 'e'

    t = TableScreenBased(p, table_dict, gui_signals, game_logger, version)
    t.screenshot = Image.open(
        get_dir(os.path.join('log', 'pics', 'table_' + prefix + '_0.png')))
    t.get_dealer_position()
    t.get_miss_player()
    p_Zenith = CurrentHandPreflopStateZenith()
    p_Zenith.reset()
    # Specify miss player or calculate through t.get_miss_player().
    p_Zenith.miss_player = t.miss_player
    p_Zenith.dealer_position = t.dealer_position
    p_Zenith.small_blind = SB
    p_Zenith.abs_to_rel()

    table_preflop_zenith(t, p_Zenith, prefix, -2, 20)

    print(p_Zenith.actions)
Exemplo n.º 11
0
def test_ocr_pp1():
    mongo = MongoManager()
    table_dict = mongo.get_table(
        "PartyPoker 6 Players Fast Forward $1-$2 NL Hold'em")
    table_scraper = TableScraper(table_dict)
    table_scraper.screenshot = Image.open(
        os.path.join(get_dir('tests', 'screenshots'),
                     '173280759_PreFlop_0.png'))
    table_scraper.crop_from_top_left_corner()

    result = ocr(table_scraper.screenshot, 'total_pot_area',
                 table_scraper.table_dict)
    assert result == 0.09

    result = ocr(table_scraper.screenshot, 'call_value',
                 table_scraper.table_dict)
    assert result == 0.04

    result = ocr(table_scraper.screenshot, 'raise_value',
                 table_scraper.table_dict)
    assert result == 0.1

    result = ocr(table_scraper.screenshot,
                 'player_funds_area',
                 table_scraper.table_dict,
                 player='0')
    assert result == 1.32
Exemplo n.º 12
0
def test_write_table():  # ok!!!
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_TEST')
    # print(table_dict)
    filename = str(os.getpid()) + '.txt'
    fo = open(filename, "w")
    fo.write(str(table_dict))
    fo.close()
Exemplo n.º 13
0
def test_table_and_my_cards50():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_src'], '15.png'))
    table_scraper.crop_from_top_left_corner2(select_table=2)
    table_scraper.get_table_cards2()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'AS', '2S', '6S', '8C', '7H'}  # Miss AS, 6S
Exemplo n.º 14
0
def test_table_and_my_cards11():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_src'], '2.png'))
    table_scraper.crop_from_top_left_corner2(select_table=1)
    table_scraper.get_table_cards2()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'QS', '8C', '5H', '8D'}  # Miss 5H, 8C  => Passed by resize
Exemplo n.º 15
0
def test_table_and_my_cards15():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_test'], '1.png'))
    table_scraper.crop_from_top_left_corner2(select_table=3)
    table_scraper.get_table_cards2()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'5C', 'QS', 'JH', '8D'}  # ok
Exemplo n.º 16
0
def test_table_and_my_cards27():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_test'], '4.png'))
    table_scraper.crop_from_top_left_corner2(select_table=4)
    table_scraper.get_table_cards2()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'4C', '6C', '2H'}  # Miss 4C => Passed by resize => Miss 4C, 6C
Exemplo n.º 17
0
def test_preflop_nodelist2():
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    t = TableScraper(table_dict)
    t.screenshot = Image.open(os.path.join(os.environ['test_src'], '14.png'))
    t.crop_from_top_left_corner2(select_table=3)
    if is_debug:
        t.screenshot.save('log/pics/active_player2.png')
    preflop_state_Zenith = CurrentHandPreflopStateZenith()
    h = History()
    preflop_state_Zenith.get_players_status(t)
Exemplo n.º 18
0
def test_table_and_my_cards30():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_4TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(os.path.join(os.environ['test_test'], '5.png'))
    table_scraper.crop_from_top_left_corner2(select_table=4)
    table_scraper.get_table_cards2()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'3C', '5C', '7S', '2D'}  #  Miss 3C, 5C => FIXED BY UPDATE SIZE
Exemplo n.º 19
0
def test_put_table():  # ok!!!
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    COMPUTER_NAME = os.getenv('COMPUTERNAME')
    table_dict = mongo.get_table('GG_TEST')
    fo = open("20824.txt", "r")
    dict_ = eval(fo.read())
    fo.close()
    dic = dict_
    dic['_owner'] = COMPUTER_NAME
    dic['table_name'] = 'GG_TEST_111'
    mongo.db['tables'].insert_one(dic)
Exemplo n.º 20
0
def test_get_table_delta1():
    p = StrategyHandler()
    p.read_strategy()
    p.read_strategy()
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    gui_signals = MagicMock()
    gui_signals.select_table = 0  # select table
    game_logger = GameLogger()
    version = 4.21

    log_file = get_dir(os.path.join("log", 'delta.txt'))
    f = open(log_file, "a")
    f.write("New Project\n")
    f.close()
    count = 0
    while True:
        t = TableScreenBased(p, table_dict, gui_signals, game_logger, version)
        ready = False
        while (not ready):
            ready = t.take_screenshot(True, p) and \
                    t.get_top_left_corner(p, gui_signals) and \
                    t.get_gg_poker()
        log.debug(f"Top left corner: {t.tlc}")
        log.debug(f"GG Poker : {t.gg_poker}")
        x, y = get_table_delta()
        update_delta(x, y)

        delta_x = 308 + (t.tlc[0] - t.gg_poker[0])
        delta_y = 287 + (t.tlc[1] - t.gg_poker[1])
        f = open(log_file, "a")
        f.write(f"delta_x, delta_y : {delta_x}, {delta_y} ")
        f.write("\n")
        f.write("---------------------------------------------------")
        f.write("\n")
        f.close()
        log.debug(f"delta_x, delta_y : {delta_x}, {delta_y} ")
        file_name = get_dir(os.path.join('log', 'pics', 'table_update_delta.png'))
        file_name1 = get_dir(os.path.join('log', 'pics', 'table_default_delta.png'))
        file_name2 = get_dir(os.path.join('log', 'pics', 'table_default_origin.png'))
        """
        Move table by delta_x = -8 , delta_y = -5 from config.ini
        """
        save_table_rectangle_cv2(t.screenshot, table_dict, file_name)
        reset_delta()
        save_table_rectangle_cv2(t.screenshot, table_dict, file_name1)
        t.screenshot.save(file_name2)
        count += 1
        if count >=1:
            reset_delta()
            break

    return True
Exemplo n.º 21
0
    def create_augmented_images(table_name):
        shutil.rmtree(TRAIN_FOLDER, ignore_errors=True)
        shutil.rmtree(VALIDATE_FOLDER, ignore_errors=True)

        log.info("Augmenting data with random pictures based on templates")

        from tensorflow.keras.preprocessing.image import ImageDataGenerator
        datagen = ImageDataGenerator(rotation_range=15,
                                     width_shift_range=0.2,
                                     height_shift_range=0.2,
                                     shear_range=0.05,
                                     zoom_range=0.1,
                                     horizontal_flip=False,
                                     fill_mode='nearest')

        mongo = MongoManager()
        table = mongo.get_table(table_name)

        for folder in [TRAIN_FOLDER, VALIDATE_FOLDER]:
            card_ranks_original = '23456789TJQKA'
            original_suits = 'CDHS'

            namelist = []
            for c in card_ranks_original:
                for s in original_suits:
                    namelist.append(c + s)

            for name in tqdm(namelist):
                img = table[name.lower()]  # this is a PIL image
                x = binary_pil_to_cv2(img)
                x = adjust_colors(x)

                x = x.reshape(
                    (1, ) + x.shape
                )  # this is a Numpy array with shape (1, 3, 150, 150)

                # the .flow() command below generates batches of randomly transformed images
                # and saves the results to the `preview/` directory
                i = 0
                directory = os.path.join(SCRAPER_DIR, folder, name)
                if not os.path.exists(directory):
                    os.makedirs(directory)

                for _ in datagen.flow(
                        x,
                        save_to_dir=directory,
                        save_prefix=name,
                        save_format='png',
                ):
                    i += 1
                    if i > 250:
                        break  # otherwise the generator would loop indefinitely
Exemplo n.º 22
0
def test_table_and_my_cards16():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_test'], '2.png'))
    table_scraper.crop_from_top_left_corner2(select_table=1)
    table_scraper.get_table_cards3()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'7S', '6H', '4D', '6S',
                                              '8S'}  # Additional 8H
Exemplo n.º 23
0
def test_miss_player():
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    t = TableScraper(table_dict)
    t.screenshot = Image.open(
        r"C:\Users\jinyi\source\repos\Project1\x64\Debug\screenshots\miss_player\miss_player.png"
    )
    t.crop_from_top_left_corner2(select_table=0)
    if is_debug:
        t.screenshot.save('log/pics/miss_player2.png')
    t.get_miss_player()

    assert t.miss_player == [1]
Exemplo n.º 24
0
def test_players_in_game5():
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    t = TableScraper(table_dict)
    t.screenshot = Image.open(os.path.join(os.environ['test_src'], '5.png'))
    t.crop_from_top_left_corner2(select_table=0)
    if is_debug:
        t.screenshot.save('log/pics/players_in_game.png')
    t.get_players_in_game()
    t.get_dealer_position2()

    assert t.players_in_game == [0, 2, 5]
    assert t.dealer_position == 3
Exemplo n.º 25
0
def test_table_and_my_cards24():  # ok
    log = logging.getLogger(__name__)
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    table_scraper = TableScraper(table_dict)

    table_scraper.screenshot = Image.open(
        os.path.join(os.environ['test_test'], '4.png'))
    table_scraper.crop_from_top_left_corner2(select_table=1)
    table_scraper.get_table_cards3()
    print(table_scraper.table_cards)
    assert set(table_scraper.table_cards) == {'KS', '3D', '4S', 'AS'
                                              }  # Miss AS => Passed by resize
Exemplo n.º 26
0
def test_active_player():
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_6TABLE')
    t = TableScraper(table_dict)
    t.screenshot = Image.open(os.path.join(os.environ['test_src'], '27.png'))
    t.crop_from_top_left_corner2(select_table=1)
    if is_debug:
        t.screenshot.save('log/pics/active_player.png')
    preflop_state_Zenith = CurrentHandPreflopStateZenith()
    h = History()
    preflop_state_Zenith.get_players_status(t)

    pytest.assume(preflop_state_Zenith.action == 'LJ_1.0')
    pytest.assume(preflop_state_Zenith.now_player_order == 1)
Exemplo n.º 27
0
def test_card_upload():  # OK!
    mongo = MongoManager()
    table_dict = mongo.get_table('GG_TEST')
    table_scraper = TableScraper(table_dict)
    # table_scraper.screenshot = Image.open(os.path.join(get_dir('tests', 'screenshots'), 'test5.png'))
    # screnshot = table_scraper.crop_from_top_left_corner()
    CARD_VALUES = "23456789TJQKA"
    CARD_SUITES = "CDHS"
    for value in CARD_VALUES:
        for suit in CARD_SUITES:
            fileName = value.upper() + suit.lower() + '.png'
            label = value.lower() + suit.lower()
            pil_image = Image.open(os.path.join('../../../card-detector\\images', fileName))
            mongo.update_table_image(pil_image, label=label, table_name='GG_TEST')