blob: 87d58fd99f27b554df58baa7441ce883bcaa2940 [file] [log] [blame]
Ben Murdochda12d292016-06-02 14:46:10 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/v8.h"
6
7#include "src/interpreter/source-position-table.h"
8#include "test/unittests/test-utils.h"
9
10namespace v8 {
11namespace internal {
12namespace interpreter {
13
14class SourcePositionTableTest : public TestWithIsolateAndZone {
15 public:
16 SourcePositionTableTest() {}
17 ~SourcePositionTableTest() override {}
18};
19
20// Some random offsets, mostly at 'suspicious' bit boundaries.
21static int offsets[] = {0, 1, 2, 3, 4, 30, 31, 32,
22 33, 62, 63, 64, 65, 126, 127, 128,
23 129, 250, 1000, 9999, 12000, 31415926};
24
25TEST_F(SourcePositionTableTest, EncodeStatement) {
26 SourcePositionTableBuilder builder(isolate(), zone());
27 for (int i = 0; i < arraysize(offsets); i++) {
Ben Murdochc5610432016-08-08 18:44:38 +010028 builder.AddPosition(offsets[i], offsets[i], true);
Ben Murdochda12d292016-06-02 14:46:10 +010029 }
30
31 // To test correctness, we rely on the assertions in ToSourcePositionTable().
32 // (Also below.)
33 CHECK(!builder.ToSourcePositionTable().is_null());
34}
35
36TEST_F(SourcePositionTableTest, EncodeStatementDuplicates) {
37 SourcePositionTableBuilder builder(isolate(), zone());
38 for (int i = 0; i < arraysize(offsets); i++) {
Ben Murdochc5610432016-08-08 18:44:38 +010039 builder.AddPosition(offsets[i], offsets[i], true);
40 builder.AddPosition(offsets[i], offsets[i] + 1, true);
Ben Murdochda12d292016-06-02 14:46:10 +010041 }
42
43 // To test correctness, we rely on the assertions in ToSourcePositionTable().
44 // (Also below.)
45 CHECK(!builder.ToSourcePositionTable().is_null());
46}
47
48TEST_F(SourcePositionTableTest, EncodeExpression) {
49 SourcePositionTableBuilder builder(isolate(), zone());
50 for (int i = 0; i < arraysize(offsets); i++) {
Ben Murdochc5610432016-08-08 18:44:38 +010051 builder.AddPosition(offsets[i], offsets[i], false);
Ben Murdochda12d292016-06-02 14:46:10 +010052 }
53 CHECK(!builder.ToSourcePositionTable().is_null());
54}
55
56TEST_F(SourcePositionTableTest, EncodeAscending) {
57 SourcePositionTableBuilder builder(isolate(), zone());
58
Ben Murdoch61f157c2016-09-16 13:49:30 +010059 int code_offset = 0;
60 int source_position = 0;
Ben Murdochda12d292016-06-02 14:46:10 +010061 for (int i = 0; i < arraysize(offsets); i++) {
Ben Murdoch61f157c2016-09-16 13:49:30 +010062 code_offset += offsets[i];
63 source_position += offsets[i];
Ben Murdochda12d292016-06-02 14:46:10 +010064 if (i % 2) {
Ben Murdoch61f157c2016-09-16 13:49:30 +010065 builder.AddPosition(code_offset, source_position, true);
Ben Murdochda12d292016-06-02 14:46:10 +010066 } else {
Ben Murdoch61f157c2016-09-16 13:49:30 +010067 builder.AddPosition(code_offset, source_position, false);
Ben Murdochda12d292016-06-02 14:46:10 +010068 }
69 }
70
Ben Murdoch61f157c2016-09-16 13:49:30 +010071 // Also test negative offsets for source positions:
Ben Murdochda12d292016-06-02 14:46:10 +010072 for (int i = 0; i < arraysize(offsets); i++) {
Ben Murdoch61f157c2016-09-16 13:49:30 +010073 code_offset += offsets[i];
74 source_position -= offsets[i];
Ben Murdochda12d292016-06-02 14:46:10 +010075 if (i % 2) {
Ben Murdoch61f157c2016-09-16 13:49:30 +010076 builder.AddPosition(code_offset, source_position, true);
Ben Murdochda12d292016-06-02 14:46:10 +010077 } else {
Ben Murdoch61f157c2016-09-16 13:49:30 +010078 builder.AddPosition(code_offset, source_position, false);
Ben Murdochda12d292016-06-02 14:46:10 +010079 }
80 }
81
82 CHECK(!builder.ToSourcePositionTable().is_null());
83}
84
85} // namespace interpreter
86} // namespace internal
87} // namespace v8