Index: pkg/source_maps/test/span_test.dart |
diff --git a/pkg/source_maps/test/span_test.dart b/pkg/source_maps/test/span_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8f61b5871f99aa313f531b99dbbcb60ec425939d |
--- /dev/null |
+++ b/pkg/source_maps/test/span_test.dart |
@@ -0,0 +1,215 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library test.span_test; |
+ |
+import 'package:unittest/unittest.dart'; |
+import 'package:source_maps/span.dart'; |
+ |
+const String TEST_FILE = ''' |
++23456789_ |
+ + _123456789_123456789_123456789_123456789_123456789_123456789_123456789_ |
+ + _123456789_1 |
+123+56789_123456789_1234567 |
+1234+6789_1234 |
+12345+789_123456789_12345 |
+123456+89_123456789_123456789_123456789_123456789_123456789_123456789_123456789 |
+1234567+9_123456789_123456789_123456789_123456789_123456789_123456789_123 |
+12345678+_123456789_123456789_123456789_123456789_1 |
+123456789+123456789_123456789_12345678 |
+123456789_+23456789_123456789_123456789_123 |
+123456789_1+3456789_123456789 |
+'''; |
+ |
+List<int> newLines = TEST_FILE.split('\n').map((s) => s.length).toList(); |
+ |
+main() { |
+ var file = new SourceFile.text('file', TEST_FILE); |
+ span(int start, int end) => file.span(start, end); |
+ loc(int offset) => file.location(offset); |
+ |
+ test('validate test input', () { |
+ expect(newLines, |
+ const [10, 80, 31, 27, 14, 25, 79, 73, 51, 38, 43, 29, 0]); |
+ }); |
+ |
+ test('get line and column', () { |
+ line(int n) => file.getLine(n); |
+ col(int n) => file.getColumn(file.getLine(n), n); |
+ |
+ expect(line(8), 0); |
+ expect(line(10), 0); |
+ expect(line(11), 1); |
+ expect(line(12), 1); |
+ expect(line(91), 1); |
+ expect(line(92), 2); |
+ expect(line(93), 2); |
+ expect(col(11), 0); |
+ expect(col(12), 1); |
+ expect(col(91), 80); |
+ expect(col(92), 0); |
+ expect(col(93), 1); |
+ |
+ int j = 0; |
+ int lineOffset = 0; |
+ for (int i = 0; i < TEST_FILE.length; i++) { |
+ if (i > lineOffset + newLines[j]) { |
+ lineOffset += newLines[j] + 1; |
+ j++; |
+ } |
+ expect(line(i), j, reason: 'position: $i'); |
+ expect(col(i), i - lineOffset, reason: 'position: $i'); |
+ } |
+ }); |
+ |
+ test('get text', () { |
+ // fifth line (including 4 new lines), columns 2 .. 11 |
+ var line = 10 + 80 + 31 + 27 + 4; |
+ expect(file.getText(line + 2, line + 11), '34+6789_1'); |
+ }); |
+ |
+ test('get location message', () { |
+ // fifth line (including 4 new lines), columns 2 .. 11 |
+ var line = 10 + 80 + 31 + 27 + 4; |
+ expect(file.getLocationMessage('the message', line + 2, line + 11), |
+ 'file:5:3: the message\n' |
+ '1234+6789_1234\n' |
+ ' ^^^^^^^^^'); |
+ }); |
+ |
+ test('get location message - no file url', () { |
+ var line = 10 + 80 + 31 + 27 + 4; |
+ expect(new SourceFile.text(null, TEST_FILE).getLocationMessage( |
+ 'the message', line + 2, line + 11), |
+ ':5:3: the message\n' |
+ '1234+6789_1234\n' |
+ ' ^^^^^^^^^'); |
+ }); |
+ |
+ test('location getters', () { |
+ expect(loc(8).line, 0); |
+ expect(loc(8).column, 8); |
+ expect(loc(9).line, 0); |
+ expect(loc(9).column, 9); |
+ expect(loc(8).formatString, 'file:1:9'); |
+ expect(loc(12).line, 1); |
+ expect(loc(12).column, 1); |
+ expect(loc(95).line, 2); |
+ expect(loc(95).column, 3); |
+ }); |
+ |
+ test('location compare', () { |
+ var list = [9, 8, 11, 14, 6, 6, 1, 1].map((n) => loc(n)).toList(); |
+ list.sort(); |
+ var lastOffset = 0; |
+ for (var location in list) { |
+ expect(location.offset, greaterThanOrEqualTo(lastOffset)); |
+ lastOffset = location.offset; |
+ } |
+ }); |
+ |
+ test('span getters', () { |
+ expect(span(8, 9).start.line, 0); |
+ expect(span(8, 9).start.column, 8); |
+ expect(span(8, 9).end.line, 0); |
+ expect(span(8, 9).end.column, 9); |
+ expect(span(8, 9).text, '9'); |
+ expect(span(8, 9).isIdentifier, false); |
+ expect(span(8, 9).formatLocation, 'file:1:9'); |
+ |
+ var line = 10 + 80 + 31 + 27 + 4; |
+ expect(span(line + 2, line + 11).getLocationMessage('the message'), |
+ 'file:5:3: the message\n' |
+ '1234+6789_1234\n' |
+ ' ^^^^^^^^^'); |
+ |
+ expect(span(12, 95).start.line, 1); |
+ expect(span(12, 95).start.column, 1); |
+ expect(span(12, 95).end.line, 2); |
+ expect(span(12, 95).end.column, 3); |
+ expect(span(12, 95).text, |
+ '+ _123456789_123456789_123456789_123456789_123456789_1234567' |
+ '89_123456789_\n +'); |
+ expect(span(12, 95).formatLocation, 'file:2:2'); |
+ }); |
+ |
+ test('span union', () { |
+ var union = new FileSpan.union(span(8, 9), span(12, 95)); |
+ expect(union.start.offset, 8); |
+ expect(union.start.line, 0); |
+ expect(union.start.column, 8); |
+ expect(union.end.offset, 95); |
+ expect(union.end.line, 2); |
+ expect(union.end.column, 3); |
+ expect(union.text, |
+ '9_\n' |
+ ' + _123456789_123456789_123456789_123456789_123456789_' |
+ '123456789_123456789_\n +'); |
+ expect(union.formatLocation, 'file:1:9'); |
+ }); |
+ |
+ test('span compare', () { |
+ var list = [span(9, 10), span(8, 9), span(11, 12), span(14, 19), |
+ span(6, 12), span(6, 8), span(1, 9), span(1, 2)]; |
+ list.sort(); |
+ var lastStart = 0; |
+ var lastEnd = 0; |
+ for (var span in list) { |
+ expect(span.start.offset, greaterThanOrEqualTo(lastStart)); |
+ if (span.start.offset == lastStart) { |
+ expect(span.end.offset, greaterThanOrEqualTo(lastEnd)); |
+ } |
+ lastStart = span.start.offset; |
+ lastEnd = span.end.offset; |
+ } |
+ }); |
+ |
+ test('file segment', () { |
+ var segment = new SourceFileSegment('file', |
+ TEST_FILE.substring(12), loc(12)); |
+ sline(int n) => segment.getLine(n); |
+ scol(int n) => segment.getColumn(segment.getLine(n), n); |
+ |
+ line(int n) => file.getLine(n); |
+ col(int n) => file.getColumn(file.getLine(n), n); |
+ |
+ int j = 0; |
+ int lineOffset = 0; |
+ for (int i = 12; i < TEST_FILE.length; i++) { |
+ if (i > lineOffset + newLines[j]) { |
+ lineOffset += newLines[j] + 1; |
+ j++; |
+ } |
+ expect(segment.location(i - 12).offset, i); |
+ expect(segment.location(i - 12).line, line(i)); |
+ expect(segment.location(i - 12).column, col(i)); |
+ expect(segment.span(i - 12).start.offset, i); |
+ expect(segment.span(i - 12).start.line, line(i)); |
+ expect(segment.span(i - 12).start.column, col(i)); |
+ |
+ expect(sline(i), line(i)); |
+ expect(scol(i), col(i)); |
+ } |
+ }); |
+ |
+ test('span isIdentifier defaults to false', () { |
+ var start = new TestLocation(0); |
+ var end = new TestLocation(1); |
+ expect(new TestSpan(start, end).isIdentifier, false); |
+ expect(file.span(8, 9, null).isIdentifier, false); |
+ expect(new FixedSpan('', 8, 1, 8, isIdentifier: null).isIdentifier, false); |
+ }); |
+} |
+ |
+class TestSpan extends Span { |
+ TestSpan(Location start, Location end) : super(start, end, null); |
+ get text => null; |
+} |
+ |
+class TestLocation extends Location { |
+ String get sourceUrl => ''; |
+ TestLocation(int offset) : super(offset); |
+ get line => 0; |
+ get column => 0; |
+} |