Skip to content

Commit

Permalink
test(trainer): test algorithms.json format
Browse files Browse the repository at this point in the history
  • Loading branch information
GabinL21 committed Feb 8, 2025
1 parent e123f6f commit bd5dae2
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 1 deletion.
2 changes: 1 addition & 1 deletion pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -875,7 +875,7 @@ packages:
source: hosted
version: "1.2.1"
test:
dependency: transitive
dependency: "direct dev"
description:
name: test
sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f
Expand Down
1 change: 1 addition & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ dev_dependencies:
flutter_test:
sdk: flutter
mocktail: ^1.0.4
test: ^1.16.0
very_good_analysis: ^5.1.0

flutter:
Expand Down
84 changes: 84 additions & 0 deletions test/trainer/algorithms_json_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import 'dart:convert';
import 'dart:io';

import 'package:kubrs_app/scramble/utils/scramble_visualizer.dart';
import 'package:test/test.dart';

void main() {
group('algorithms.json', () {
late Map<String, dynamic> jsonData;

setUpAll(() async {
final file = File('assets/algorithms.json');
final content = await file.readAsString();
jsonData = jsonDecode(content) as Map<String, dynamic>;
});

test('should have unique IDs', () {
final ids = <int>{};
for (final group in jsonData['groups']! as List<dynamic>) {
_validateUniqueIds(group as Map<String, dynamic>, ids);
}
});

test('should have valid format', () {
expect(jsonData, isA<Map<String, dynamic>>());
expect(jsonData['groups'], isA<List>());

for (final group in jsonData['groups']! as List<dynamic>) {
_validateGroupFormat(group as Map<String, dynamic>);
}
});
});
}

void _validateUniqueIds(Map<String, dynamic> group, Set<int> ids) {
for (final algorithm in group['algorithms']! as List<dynamic>) {
final id = algorithm['id']! as int;
expect(ids.contains(id), isFalse, reason: 'Duplicate ID found: $id');
ids.add(id);
}
}

void _validateGroupFormat(Map<String, dynamic> group) {
expect(group, isA<Map<String, dynamic>>());
expect(group['id'], isA<int>());
expect(group['name'], isA<String>());
expect(group['algorithms'], isA<List>());

for (final algorithm in group['algorithms']! as List<dynamic>) {
_validateAlgorithmFormat(algorithm as Map<String, dynamic>);
}
}

void _validateAlgorithmFormat(Map<String, dynamic> algorithm) {
expect(algorithm, isA<Map<String, dynamic>>());
expect(algorithm['id'], isA<int>());
expect(algorithm['name'], isA<String>());
expect(algorithm['solution'], isA<String>());
expect(algorithm['pattern'], isA<Map<String, dynamic>>());
expect(algorithm['scrambles'], isA<List>());

_validatePattern(algorithm['pattern']! as Map<String, dynamic>);
_validateScrambles(algorithm['scrambles']! as List<dynamic>);
}

void _validatePattern(Map<String, dynamic> pattern) {
expect(pattern.keys, containsAll(['U', 'F', 'R', 'B', 'L']));
for (final face in pattern.keys) {
final expectedLength = face == 'U' ? 9 : 3;
expect(pattern[face], hasLength(expectedLength));
for (final color in pattern[face]! as List<dynamic>) {
expect(color, isA<int>());
expect(color, greaterThanOrEqualTo(0));
expect(color, lessThanOrEqualTo(6));
}
}
}

void _validateScrambles(List<dynamic> scrambles) {
for (final scramble in scrambles) {
expect(scramble, isA<String>());
expect(() => Cube.getScrambledCube(scramble as String), returnsNormally);
}
}

0 comments on commit bd5dae2

Please sign in to comment.