diff --git a/pubspec.lock b/pubspec.lock index f94cd3e..9898f7c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,30 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + args: + dependency: transitive + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" async: dependency: transitive description: @@ -41,6 +65,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -96,6 +144,54 @@ packages: description: flutter source: sdk version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" leak_tracker: dependency: transitive description: @@ -128,6 +224,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: @@ -152,6 +256,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" path: dependency: transitive description: @@ -200,6 +328,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" shared_preferences: dependency: "direct main" description: @@ -256,11 +400,59 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" source_span: dependency: transitive description: @@ -301,6 +493,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" + url: "https://pub.dev" + source: hosted + version: "1.25.2" test_api: dependency: transitive description: @@ -309,6 +509,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + test_core: + dependency: transitive + description: + name: test_core + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" vector_math: dependency: transitive description: @@ -325,6 +541,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.1" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" web: dependency: transitive description: @@ -333,6 +557,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" win32: dependency: transitive description: @@ -349,6 +589,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: dart: ">=3.4.0 <4.0.0" flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 98b9910..d418b6a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,7 @@ dev_dependencies: # package. See that file for information about deactivating specific lint # rules and activating additional ones. flutter_lints: ^4.0.0 + test: ^1.16.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/test/unit_test.dart b/test/unit_test.dart new file mode 100644 index 0000000..31b8551 --- /dev/null +++ b/test/unit_test.dart @@ -0,0 +1,138 @@ +import 'package:bubbletwist/enums/stone_color.dart'; +import 'package:bubbletwist/game/board.dart'; +import 'package:bubbletwist/game/game.dart'; +import 'package:bubbletwist/game/i_game_consumer.dart'; +import 'package:bubbletwist/game/stone/stone.dart'; +import 'package:bubbletwist/game/stone/stone_location.dart'; +import 'package:test/test.dart'; + +void main() { + group('Game Tests', () { + late Game game; + late MockGameConsumer mockGameConsumer; + + setUp(() { + mockGameConsumer = MockGameConsumer(); + game = Game(mockGameConsumer); + }); + + tearDown(() { + game.stop(); // Ensure game is stopped after each test + }); + + test('Initial points should be 0', () { + expect(game.getPoints(), 0); + }); + + test('Initial time should be equal to startTime', () { + expect(game.getTimeInSeconds(), game.startTime); + }); + + test('Start method should start the game', () { + game.start(); + expect(game.isRunning(), isTrue); + }); + + test('Stop method should stop the game', () { + game.start(); + game.stop(); + expect(game.isRunning(), isFalse); + }); + + test('AddPoints should update points if game is running', () { + game.start(); + game.addPoints(10); + expect(game.getPoints(), 10); + }); + }); + + group('Board Tests', () { + late Game game; + late Board board; + + setUp(() { + game = Game(MockGameConsumer()); + board = Board(game); + }); + + tearDown(() { + game.stop(); // Ensure game is stopped after each test + }); + + test('Swap stones should correctly swap positions', () { + // Arrange + // Arrange: Create a board with a match + board.stones[0][0]!.setColor(StoneColors.red); + board.stones[0][1]!.setColor(StoneColors.red); + board.stones[0][2]!.setColor(StoneColors.green); + board.stones[1][2]!.setColor(StoneColors.red); + StoneLocation sl1 = StoneLocation(row: 0, column: 2); + StoneLocation sl2 = StoneLocation(row: 1, column: 2); + Stone? originalStone1 = board.getStone(sl1); + Stone? originalStone2 = board.getStone(sl2); + + // Act + board.swap(sl1, sl2); + + // Assert + expect(board.getStone(sl1), originalStone2); + expect(board.getStone(sl2), originalStone1); + }); + + test('CheckBoard should detect and remove matches vertically', () { + // Arrange: Create a board with a match + board.stones[0][0]!.setColor(StoneColors.red); + board.stones[0][1]!.setColor(StoneColors.red); + board.stones[0][2]!.setColor(StoneColors.red); + + // Act + bool boardChanged = board.checkBoard(); + + // Assert + expect(boardChanged, isTrue); + }); + + test('CheckBoard should detect and remove matches horizontally', () { + // Arrange: Create a board with a match + board.stones[0][0]!.setColor(StoneColors.red); + board.stones[1][0]!.setColor(StoneColors.red); + board.stones[2][0]!.setColor(StoneColors.red); + + // Act + bool boardChanged = board.checkBoard(); + + // Assert + expect(boardChanged, isTrue); + }); + + test('ApplyGravity should move stones down and refill', () { + // Arrange: Create a board with some empty spaces + board.stones[0][0] = null; + board.stones[1][0] = null; + + // Act + board.applyGravity(); + + // Assert + // Verify that stones have fallen down and all empty spaces are filled + expect(board.getStone(StoneLocation(row: 0, column: 0)), isNotNull); + expect(board.getStone(StoneLocation(row: 1, column: 0)), isNotNull); + expect(board.getStone(StoneLocation(row: 2, column: 0)), isNotNull); + }); + }); +} + +// Mock class for IGameConsumer +class MockGameConsumer implements IGameConsumer { + @override + void gameStopped() {} + + @override + void updatePoints() {} + + @override + void updateStones() {} + + @override + void updateTime() {} +}