Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(449)

Unified Diff: packages/petitparser/test/reflection_test.dart

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « packages/petitparser/test/petitparser_test.dart ('k') | packages/petitparser/test/smalltalk_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: packages/petitparser/test/reflection_test.dart
diff --git a/packages/petitparser/test/reflection_test.dart b/packages/petitparser/test/reflection_test.dart
new file mode 100644
index 0000000000000000000000000000000000000000..dc200a9694dacd0128bbb2fc9822aa7088ac96a3
--- /dev/null
+++ b/packages/petitparser/test/reflection_test.dart
@@ -0,0 +1,159 @@
+library petitparser.test.reflection_test;
+
+import 'package:test/test.dart';
+
+import 'package:petitparser/petitparser.dart';
+import 'package:petitparser/reflection.dart';
+
+main() {
+ group('iterator', () {
+ test('single', () {
+ var parser1 = lowercase();
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1]);
+ });
+ test('nested', () {
+ var parser3 = lowercase();
+ var parser2 = parser3.star();
+ var parser1 = parser2.flatten();
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1, parser2, parser3]);
+ });
+ test('branched', () {
+ var parser3 = lowercase();
+ var parser2 = uppercase();
+ var parser1 = parser2.seq(parser3);
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1, parser3, parser2]);
+ });
+ test('duplicated', () {
+ var parser2 = uppercase();
+ var parser1 = parser2.seq(parser2);
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1, parser2]);
+ });
+ test('knot', () {
+ var parser1 = undefined();
+ parser1.set(parser1);
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1]);
+ });
+ test('looping', () {
+ var parser1 = undefined();
+ var parser2 = undefined();
+ var parser3 = undefined();
+ parser1.set(parser2);
+ parser2.set(parser3);
+ parser3.set(parser1);
+ var parsers = allParser(parser1).toList();
+ expect(parsers, [parser1, parser2, parser3]);
+ });
+ test('basic', () {
+ var lower = lowercase();
+ var iterator = allParser(lower).iterator;
+ expect(iterator.current, isNull);
+ expect(iterator.moveNext(), isTrue);
+ expect(iterator.current, lower);
+ expect(iterator.current, lower);
+ expect(iterator.moveNext(), isFalse);
+ expect(iterator.current, isNull);
+ expect(iterator.moveNext(), isFalse);
+ });
+ });
+ group('transform', () {
+ test('copy', () {
+ var input = lowercase().settable();
+ var output = transformParser(input, (parser) => parser);
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isTrue);
+ expect(input.children.single, isNot(output.children.single));
+ });
+ test('root', () {
+ var source = lowercase();
+ var input = source;
+ var target = uppercase();
+ var output = transformParser(input, (parser) {
+ return source.isEqualTo(parser) ? target : parser;
+ });
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isFalse);
+ expect(input, source);
+ expect(output, target);
+ });
+ test('single', () {
+ var source = lowercase();
+ var input = source.settable();
+ var target = uppercase();
+ var output = transformParser(input, (parser) {
+ return source.isEqualTo(parser) ? target : parser;
+ });
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isFalse);
+ expect(input.children.single, source);
+ expect(output.children.single, target);
+ });
+ test('double', () {
+ var source = lowercase();
+ var input = source & source;
+ var target = uppercase();
+ var output = transformParser(input, (parser) {
+ return source.isEqualTo(parser) ? target : parser;
+ });
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isFalse);
+ expect(input.isEqualTo(source & source), isTrue);
+ expect(input.children.first, input.children.last);
+ expect(output.isEqualTo(target & target), isTrue);
+ expect(output.children.first, output.children.last);
+ });
+ test('loop (existing)', () {
+ var input = failure().settable().settable().settable();
+ input.children.single.children.single.set(input);
+ var output = transformParser(input, (parser) {
+ return parser;
+ });
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isTrue);
+ var inputs = allParser(input).toSet();
+ var outputs = allParser(output).toSet();
+ inputs.forEach((each) => expect(outputs.contains(each), isFalse));
+ outputs.forEach((each) => expect(inputs.contains(each), isFalse));
+ });
+ test('loop (new)', () {
+ var source = lowercase();
+ var input = source;
+ var target = failure().settable().settable().settable();
+ target.children.single.children.single.set(target);
+ var output = transformParser(input, (parser) {
+ return source.isEqualTo(parser) ? target : parser;
+ });
+ expect(input, isNot(output));
+ expect(input.isEqualTo(output), isFalse);
+ expect(output.isEqualTo(target), isTrue);
+ });
+ });
+ group('optimize', () {
+ test('remove setables', () {
+ var input = lowercase().settable();
+ var output = removeSettables(input);
+ expect(output.isEqualTo(lowercase()), isTrue);
+ });
+ test('remove nested setables', () {
+ var input = lowercase().settable().star();
+ var output = removeSettables(input);
+ expect(output.isEqualTo(lowercase().star()), isTrue);
+ });
+ test('remove double setables', () {
+ var input = lowercase().settable().settable();
+ var output = removeSettables(input);
+ expect(output.isEqualTo(lowercase()), isTrue);
+ });
+ test('remove duplicate', () {
+ var input = lowercase() & lowercase();
+ var output = removeDuplicates(input);
+ expect(input.isEqualTo(output), isTrue);
+ expect(input.children.first, isNot(input.children.last));
+ expect(output.children.first, output.children.last);
+ });
+ });
+}
« no previous file with comments | « packages/petitparser/test/petitparser_test.dart ('k') | packages/petitparser/test/smalltalk_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698