[iagno] Add perfs tests.



commit c55f2ad5ff50a91f630ffc50066fda56514331e2
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Fri Apr 19 15:28:12 2019 +0200

    Add perfs tests.

 meson_options.txt        |   1 +
 src/computer-player.vala |  17 +++
 src/game.vala            |  11 +-
 src/meson.build          |   5 +-
 src/test-iagno.vala      | 331 ++++++++++++++++++++++++++++++++++++++++++++++-
 5 files changed, 360 insertions(+), 5 deletions(-)
---
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000..dc15050
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1 @@
+option('perfs_tests', type : 'boolean', value : false, description : 'Build complete games AI perfs and 
regression tests')
diff --git a/src/computer-player.vala b/src/computer-player.vala
index 2425067..3e70c16 100644
--- a/src/computer-player.vala
+++ b/src/computer-player.vala
@@ -118,6 +118,23 @@ private class ComputerPlayer : Object
         complete_move (x, y);
     }
 
+    internal bool force_moving (uint8 force_x, uint8 force_y)
+    {
+        uint8 x;
+        uint8 y;
+
+        move_pending = true;
+        run_search (out x, out y);
+        complete_move (force_x, force_y);
+
+        print (@"\nx: $x, y: $y");
+
+        return (x == force_x)
+            && (y == force_y);
+    }
+
+    /* real game */
+
     internal async void move_async (double delay_seconds = 0.0)
     {
         Timer timer = new Timer ();
diff --git a/src/game.vala b/src/game.vala
index 115c751..f5f5573 100644
--- a/src/game.vala
+++ b/src/game.vala
@@ -147,14 +147,23 @@ private class Game : Object
     {
         Object (size: _size);
 
+        initial_number_of_tiles = (size % 2 == 0) ? 4 : 7;
         init_undo_stack (_size, out undo_stack);
 
+        _n_dark_tiles = 0;
+        _n_light_tiles = 0;
+
         for (uint8 y = 0; y < _size; y++)
         {
             if (setup [y].length != _size * 2)
                 warn_if_reached ();
             for (uint8 x = 0; x < _size; x++)
-                tiles [x, y] = Player.from_char (setup [y][x * 2 + 1]);
+            {
+                Player player = Player.from_char (setup [y][x * 2 + 1]);
+                if      (player == Player.DARK)  _n_dark_tiles++;
+                else if (player == Player.LIGHT) _n_light_tiles++;
+                tiles [x, y] = player;
+            }
         }
 
         current_color = to_move;
diff --git a/src/meson.build b/src/meson.build
index 3632757..9e9e8ae 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -10,7 +10,10 @@ iagno_tests = executable('iagno_tests',
         gio_dependency
     ]
 )
-test('iagno-tests', iagno_tests)
+test('iagno-short-tests', iagno_tests, timeout : 1)
+if get_option('perfs_tests')
+    test('iagno-perfs-tests', iagno_tests, args : ['-m', 'perf'], timeout : 120)
+endif
 
 executable(meson.project_name(),
     [
diff --git a/src/test-iagno.vala b/src/test-iagno.vala
index db8dffa..bc2859b 100644
--- a/src/test-iagno.vala
+++ b/src/test-iagno.vala
@@ -21,10 +21,25 @@
 
 private class TestIagno : Object
 {
-    private static int main (string [] args) {
+    private static int main (string [] args)
+    {
         Test.init (ref args);
+
         Test.add_func ("/Iagno/test tests",
                             test_tests);
+
+        // if meson is configured with -Dperfs_tests=true,
+        // both tests are performed, else only short_tests
+        if (Test.perf ())
+            perfs_tests ();
+        else
+            short_tests ();
+
+        return Test.run ();
+    }
+
+    private static void short_tests ()
+    {
         Test.add_func ("/Iagno/Pass then Undo",
                             test_undo_after_pass);
         Test.add_func ("/Iagno/Undo at Start",
@@ -41,7 +56,18 @@ private class TestIagno : Object
                             test_ai_search_4);
         Test.add_func ("/Iagno/AI Search 5",
                             test_ai_search_5);
-        return Test.run ();
+    }
+
+    private static void perfs_tests ()
+    {
+        Test.add_func ("/Iagno/Complete game 1",
+                            test_complete_game_1);
+        Test.add_func ("/Iagno/Complete game 2",
+                            test_complete_game_2);
+        Test.add_func ("/Iagno/Complete game 3",
+                            test_complete_game_3);
+        Test.add_func ("/Iagno/Complete game 4",
+                            test_complete_game_4);
     }
 
     private static void test_tests ()
@@ -50,7 +76,7 @@ private class TestIagno : Object
     }
 
     /*\
-    * * tests
+    * * short tests
     \*/
 
     private static void test_undo_after_pass ()
@@ -189,4 +215,303 @@ private class TestIagno : Object
         ai.move ();
         /* didn't crash */
     }
+
+    /*\
+    * * perfs tests
+    \*/
+
+    private static void test_complete_game_1 ()
+    {
+        /* human starts              0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ." };
+
+        Game game = new Game.from_strings (board, Player.DARK);
+        ComputerPlayer ai = new ComputerPlayer (game, /* AI level */ 3);
+
+        assert_true (game.place_tile (4, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 5));
+        assert_true (game.place_tile (4, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 5));
+        assert_true (game.place_tile (2, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 4));
+        assert_true (game.place_tile (4, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 6));
+        assert_true (game.place_tile (1, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 4));
+        assert_true (game.place_tile (2, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 3));
+        assert_true (game.place_tile (1, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 2));
+        assert_true (game.place_tile (3, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 2));
+        assert_true (game.place_tile (6, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 6));
+        assert_true (game.place_tile (3, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 5));
+        assert_true (game.place_tile (3, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 7));
+        assert_true (game.place_tile (0, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 2));
+        assert_true (game.place_tile (6, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 2));
+        assert_true (game.place_tile (3, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 7));
+        assert_true (game.place_tile (4, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 6));
+        assert_true (game.place_tile (2, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 0));
+        assert_true (game.place_tile (1, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 1));
+        assert_true (game.place_tile (6, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 0));
+        assert_true (game.place_tile (5, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 3));
+        assert_true (game.place_tile (6, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 2));
+        assert_true (game.place_tile (5, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 1));
+        assert_true (game.place_tile (7, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 5));
+        assert_true (game.place_tile (7, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 0));
+        assert_true (game.place_tile (7, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 7));
+        assert_true (game.place_tile (7, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 0));
+        assert_true (game.place_tile (0, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 1));
+        assert_true (game.place_tile (0, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 6));
+        assert_true (game.place_tile (1, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 7));
+    }
+
+    private static void test_complete_game_2 ()
+    {
+        /* human starts              0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ." };
+
+        Game game = new Game.from_strings (board, Player.DARK);
+        ComputerPlayer ai = new ComputerPlayer (game, /* AI level */ 3);
+
+        assert_true (game.place_tile (4, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 5));
+        assert_true (game.place_tile (6, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 2));
+        assert_true (game.place_tile (6, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 2));
+        assert_true (game.place_tile (3, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 5));
+        assert_true (game.place_tile (3, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 3));
+        assert_true (game.place_tile (2, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 6));
+        assert_true (game.place_tile (7, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 5));
+        assert_true (game.place_tile (3, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 5));
+        assert_true (game.place_tile (5, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 7));
+        assert_true (game.place_tile (6, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 6));
+        assert_true (game.place_tile (4, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 7));
+        assert_true (game.place_tile (1, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 2));
+        assert_true (game.place_tile (0, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 1));
+        assert_true (game.place_tile (2, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 1));
+        assert_true (game.place_tile (2, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 7));
+        assert_true (game.place_tile (4, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 4));
+        assert_true (game.place_tile (7, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 4));
+        assert_true (game.place_tile (0, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 1));
+        assert_true (game.place_tile (1, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 6));
+        assert_true (game.place_tile (1, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 0));
+        assert_true (game.place_tile (3, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 0));
+        assert_true (game.place_tile (5, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 2));
+        assert_true (game.place_tile (7, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 0));
+        assert_true (game.place_tile (6, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 7));
+        assert_true (game.place_tile (0, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 0));
+        assert_true (game.place_tile (0, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 6));
+        assert_true (game.place_tile (0, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 5));
+        assert_true (game.place_tile (7, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 1));
+    }
+
+    private static void test_complete_game_3 ()
+    {
+        /* AI starts                 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ." };
+
+        Game game = new Game.from_strings (board, Player.DARK);
+        ComputerPlayer ai = new ComputerPlayer (game, /* AI level */ 3);
+
+        assert_true (ai.force_moving (3, 5));
+        assert_true (game.place_tile (6, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 2));
+        assert_true (game.place_tile (2, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 4));
+        assert_true (game.place_tile (4, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 5));
+        assert_true (game.place_tile (2, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 5));
+        assert_true (game.place_tile (3, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 2));
+        assert_true (game.place_tile (0, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 2));
+        assert_true (game.place_tile (1, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 5));
+        assert_true (game.place_tile (4, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 1));
+        assert_true (game.place_tile (6, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 5));
+        assert_true (game.place_tile (5, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 3));
+        assert_true (game.place_tile (2, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 0));
+        assert_true (game.place_tile (4, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 1));
+        assert_true (game.place_tile (0, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 2));
+        assert_true (game.place_tile (1, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 7));
+        assert_true (game.place_tile (2, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 6));
+        assert_true (game.place_tile (4, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 7));
+        assert_true (game.place_tile (5, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 1));
+        assert_true (game.place_tile (2, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 0));
+        assert_true (game.place_tile (7, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 7));
+        assert_true (game.place_tile (7, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 6));
+        assert_true (game.place_tile (7, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 7));
+        assert_true (game.place_tile (7, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 1));
+        assert_true (game.place_tile (6, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 1));
+        assert_true (game.place_tile (0, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 7));
+        assert_true (game.place_tile (4, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 0));
+        assert_true (game.place_tile (0, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 1));
+        assert_true (game.place_tile (1, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 1));
+        assert_true (game.place_tile (7, 0, /* apply */ true) != 0);
+    }
+
+    private static void test_complete_game_4 ()
+    {
+        /* AI starts                 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ." };
+
+        Game game = new Game.from_strings (board, Player.DARK);
+        ComputerPlayer ai = new ComputerPlayer (game, /* AI level */ 3);
+
+        assert_true (ai.force_moving (5, 4));
+        assert_true (game.place_tile (6, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 5));
+        assert_true (game.place_tile (2, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 5));
+        assert_true (game.place_tile (1, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 3));
+        assert_true (game.place_tile (4, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (4, 1));
+        assert_true (game.place_tile (5, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 3));
+        assert_true (game.place_tile (4, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 6));
+        assert_true (game.place_tile (2, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 5));
+        assert_true (game.place_tile (0, 4, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 6));
+        assert_true (game.place_tile (1, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 1));
+        assert_true (game.place_tile (6, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 6));
+        assert_true (game.place_tile (3, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 0));
+        assert_true (game.place_tile (6, 5, /* apply */ true) != 0);
+        assert_true (ai.force_moving (3, 0));
+        assert_true (game.place_tile (3, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 2));
+        assert_true (game.place_tile (5, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 4));
+        assert_true (game.place_tile (7, 2, /* apply */ true) != 0);
+        assert_true (ai.force_moving (7, 5));
+        assert_true (game.place_tile (4, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 2));
+        assert_true (game.place_tile (7, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 2));
+        assert_true (game.place_tile (7, 6, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 7));
+        assert_true (game.place_tile (1, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (2, 0));
+        assert_true (game.place_tile (7, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 6));
+        assert_true (game.place_tile (0, 3, /* apply */ true) != 0);
+        assert_true (ai.force_moving (0, 5));
+        assert_true (game.place_tile (7, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 1));
+        assert_true (game.place_tile (7, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (6, 0));
+        assert_true (game.place_tile (1, 0, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 6));
+        assert_true (game.place_tile (2, 1, /* apply */ true) != 0);
+        game.pass ();
+        assert_true (game.place_tile (0, 7, /* apply */ true) != 0);
+        game.pass ();
+        assert_true (game.place_tile (0, 1, /* apply */ true) != 0);
+        assert_true (ai.force_moving (1, 1));
+        assert_true (game.place_tile (0, 0, /* apply */ true) != 0);
+        game.pass ();
+        assert_true (game.place_tile (4, 7, /* apply */ true) != 0);
+        assert_true (ai.force_moving (5, 7));
+    }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]