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 |
index 8f61b5871f99aa313f531b99dbbcb60ec425939d..66bd8a8cbb577dfccc1f658ea3a857c268ad2a80 100644 |
--- a/pkg/source_maps/test/span_test.dart |
+++ b/pkg/source_maps/test/span_test.dart |
@@ -165,32 +165,96 @@ main() { |
} |
}); |
- test('file segment', () { |
- var segment = new SourceFileSegment('file', |
- TEST_FILE.substring(12), loc(12)); |
+ test('range check for large offsets', () { |
+ var start = TEST_FILE.length; |
+ expect(file.getLocationMessage('the message', start, start + 9), |
+ 'file:13:1: the message\n'); |
+ }); |
+ |
+ group('file segment', () { |
+ var baseOffset = 123; |
+ var segmentText = TEST_FILE.substring(baseOffset, TEST_FILE.length - 100); |
+ var segment = new SourceFileSegment('file', segmentText, loc(baseOffset)); |
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++; |
+ test('get line and column', () { |
+ int j = 0; |
+ int lineOffset = 0; |
+ for (int i = baseOffset; i < segmentText.length; i++) { |
+ if (i > lineOffset + newLines[j]) { |
+ lineOffset += newLines[j] + 1; |
+ j++; |
+ } |
+ expect(segment.location(i - baseOffset).offset, i); |
+ expect(segment.location(i - baseOffset).line, line(i)); |
+ expect(segment.location(i - baseOffset).column, col(i)); |
+ expect(segment.span(i - baseOffset).start.offset, i); |
+ expect(segment.span(i - baseOffset).start.line, line(i)); |
+ expect(segment.span(i - baseOffset).start.column, col(i)); |
+ |
+ expect(sline(i), line(i)); |
+ expect(scol(i), col(i)); |
} |
- 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('get text', () { |
+ var start = 10 + 80 + 31 + 27 + 4 + 2; |
+ expect(segment.getText(start, start + 9), file.getText(start, start + 9)); |
+ }); |
+ |
+ group('location message', () { |
+ test('first line', () { |
+ var start = baseOffset + 7; |
+ expect(segment.getLocationMessage('the message', start, start + 2), |
+ file.getLocationMessage('the message', start, start + 2)); |
+ }); |
+ |
+ test('in a middle line', () { |
+ // Example from another test above: |
+ var start = 10 + 80 + 31 + 27 + 4 + 2; |
+ expect(segment.getLocationMessage('the message', start, start + 9), |
+ file.getLocationMessage('the message', start, start + 9)); |
+ }); |
+ |
+ test('last segment line', () { |
+ var start = segmentText.length - 4; |
+ expect(segment.getLocationMessage('the message', start, start + 2), |
+ file.getLocationMessage('the message', start, start + 2)); |
+ }); |
+ |
+ test('past segment, same as last segment line', () { |
+ var start = segmentText.length; |
+ expect(segment.getLocationMessage('the message', start, start + 2), |
+ file.getLocationMessage('the message', start, start + 2)); |
+ |
+ start = segmentText.length + 20; |
+ expect(segment.getLocationMessage('the message', start, start + 2), |
+ file.getLocationMessage('the message', start, start + 2)); |
+ }); |
+ |
+ test('past segment, past its line', () { |
+ var start = TEST_FILE.length - 2; |
+ expect(file.getLocationMessage('the message', start, start + 1), |
+ 'file:12:29: the message\n' |
+ '123456789_1+3456789_123456789\n' |
+ ' ^'); |
+ |
+ // TODO(sigmund): consider also fixing this and report file:10:4 |
+ // The answer below is different because the segment parsing only knows |
+ // about the 10 lines it has (and nothing about the possible extra lines |
+ // afterwards) |
+ expect(segment.getLocationMessage('the message', start, start + 1), |
+ 'file:10:112: the message\n'); |
+ |
+ // The number 112 includes the count of extra characters past the |
+ // segment, which we verify here: |
+ var lastSegmentLineStart = segmentText.lastIndexOf('\n'); |
+ expect(start - baseOffset - lastSegmentLineStart, 112); |
+ }); |
+ }); |
}); |
test('span isIdentifier defaults to false', () { |