| Index: pkg/analysis_server/test/index/b_plus_tree_test.dart
|
| diff --git a/pkg/analysis_server/test/index/b_plus_tree_test.dart b/pkg/analysis_server/test/index/b_plus_tree_test.dart
|
| deleted file mode 100644
|
| index a3abcce85fbef9702c008af8dbb37fcaef9186ff..0000000000000000000000000000000000000000
|
| --- a/pkg/analysis_server/test/index/b_plus_tree_test.dart
|
| +++ /dev/null
|
| @@ -1,686 +0,0 @@
|
| -// Copyright (c) 2014, 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.index.b_plus_tree;
|
| -
|
| -import 'dart:math';
|
| -
|
| -import 'package:analysis_server/src/index/b_plus_tree.dart';
|
| -import 'package:unittest/unittest.dart';
|
| -
|
| -import '../reflective_tests.dart';
|
| -
|
| -
|
| -main() {
|
| - groupSep = ' | ';
|
| - group('BTree', () {
|
| - runReflectiveTests(BPlusTreeTest);
|
| - });
|
| -}
|
| -
|
| -
|
| -void _assertDebugString(BPlusTree tree, String expected) {
|
| - String dump = _getDebugString(tree);
|
| - expect(dump, expected);
|
| -}
|
| -
|
| -
|
| -_TestBTree<int, String> _createTree(int maxIndexKeys, int maxLeafKeys) {
|
| - return new _TestBTree<int, String>(maxIndexKeys, maxLeafKeys, _intComparator);
|
| -}
|
| -
|
| -
|
| -String _getDebugString(BPlusTree tree) {
|
| - StringBuffer buffer = new StringBuffer();
|
| - tree.writeOn(buffer);
|
| - return buffer.toString();
|
| -}
|
| -
|
| -
|
| -int _intComparator(int a, int b) => a - b;
|
| -
|
| -
|
| -@ReflectiveTestCase()
|
| -class BPlusTreeTest {
|
| - BPlusTree<int, String, dynamic> tree = _createTree(4, 4);
|
| -
|
| - test_NoSuchMethodError() {
|
| - expect(() {
|
| - (tree as dynamic).thereIsNoSuchMethod();
|
| - }, throwsA(new isInstanceOf<NoSuchMethodError>()));
|
| - }
|
| -
|
| - void test_find() {
|
| - _insertValues(12);
|
| - expect(tree.find(-1), isNull);
|
| - expect(tree.find(1000), isNull);
|
| - for (int key = 0; key < 12; key++) {
|
| - expect(tree.find(key), 'V$key');
|
| - }
|
| - }
|
| -
|
| - void test_insert_01() {
|
| - _insert(0, 'A');
|
| - _assertDebugString(tree, 'LNode {0: A}\n');
|
| - }
|
| -
|
| - void test_insert_02() {
|
| - _insert(1, 'B');
|
| - _insert(0, 'A');
|
| - _assertDebugString(tree, 'LNode {0: A, 1: B}\n');
|
| - }
|
| -
|
| - void test_insert_03() {
|
| - _insert(2, 'C');
|
| - _insert(0, 'A');
|
| - _insert(1, 'B');
|
| - _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
|
| - }
|
| -
|
| - void test_insert_05() {
|
| - _insertValues(5);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3, 4: V4}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_insert_09() {
|
| - _insertValues(9);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 8: V8}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_insert_innerSplitLeft() {
|
| - // Prepare a tree with '0' key missing.
|
| - for (int i = 1; i < 12; i++) {
|
| - _insert(i, "V$i");
|
| - }
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {1: V1, 2: V2}
|
| - 3
|
| - LNode {3: V3, 4: V4}
|
| - 5
|
| - LNode {5: V5, 6: V6}
|
| - 7
|
| - LNode {7: V7, 8: V8}
|
| - 9
|
| - LNode {9: V9, 10: V10, 11: V11}
|
| -}
|
| -''');
|
| - // Split and insert into the 'left' child.
|
| - _insert(0, 'V0');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1, 2: V2}
|
| - 3
|
| - LNode {3: V3, 4: V4}
|
| - 5
|
| - LNode {5: V5, 6: V6}
|
| - }
|
| - 7
|
| - INode {
|
| - LNode {7: V7, 8: V8}
|
| - 9
|
| - LNode {9: V9, 10: V10, 11: V11}
|
| - }
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_insert_innerSplitRight() {
|
| - _insertValues(12);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - }
|
| - 6
|
| - INode {
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 10: V10, 11: V11}
|
| - }
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_insert_replace() {
|
| - _insert(0, 'A');
|
| - _insert(1, 'B');
|
| - _insert(2, 'C');
|
| - _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
|
| - _insert(2, 'C2');
|
| - _insert(1, 'B2');
|
| - _insert(0, 'A2');
|
| - _assertDebugString(tree, 'LNode {0: A2, 1: B2, 2: C2}\n');
|
| - }
|
| -
|
| - void test_remove_inner_borrowLeft() {
|
| - tree = _createTree(10, 4);
|
| - for (int i = 100; i < 125; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - for (int i = 0; i < 10; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 100: V100, 101: V101}
|
| - 102
|
| - LNode {102: V102, 103: V103}
|
| - 104
|
| - LNode {104: V104, 105: V105}
|
| - 106
|
| - LNode {106: V106, 107: V107}
|
| - 108
|
| - LNode {108: V108, 109: V109}
|
| - 110
|
| - LNode {110: V110, 111: V111}
|
| - }
|
| - 112
|
| - INode {
|
| - LNode {112: V112, 113: V113}
|
| - 114
|
| - LNode {114: V114, 115: V115}
|
| - 116
|
| - LNode {116: V116, 117: V117}
|
| - 118
|
| - LNode {118: V118, 119: V119}
|
| - 120
|
| - LNode {120: V120, 121: V121}
|
| - 122
|
| - LNode {122: V122, 123: V123, 124: V124}
|
| - }
|
| -}
|
| -''');
|
| - expect(tree.remove(112), 'V112');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 100: V100, 101: V101}
|
| - 102
|
| - LNode {102: V102, 103: V103}
|
| - 104
|
| - LNode {104: V104, 105: V105}
|
| - }
|
| - 106
|
| - INode {
|
| - LNode {106: V106, 107: V107}
|
| - 108
|
| - LNode {108: V108, 109: V109}
|
| - 110
|
| - LNode {110: V110, 111: V111}
|
| - 112
|
| - LNode {113: V113, 114: V114, 115: V115}
|
| - 116
|
| - LNode {116: V116, 117: V117}
|
| - 118
|
| - LNode {118: V118, 119: V119}
|
| - 120
|
| - LNode {120: V120, 121: V121}
|
| - 122
|
| - LNode {122: V122, 123: V123, 124: V124}
|
| - }
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_inner_borrowRight() {
|
| - tree = _createTree(10, 4);
|
| - for (int i = 100; i < 135; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {100: V100, 101: V101}
|
| - 102
|
| - LNode {102: V102, 103: V103}
|
| - 104
|
| - LNode {104: V104, 105: V105}
|
| - 106
|
| - LNode {106: V106, 107: V107}
|
| - 108
|
| - LNode {108: V108, 109: V109}
|
| - 110
|
| - LNode {110: V110, 111: V111}
|
| - }
|
| - 112
|
| - INode {
|
| - LNode {112: V112, 113: V113}
|
| - 114
|
| - LNode {114: V114, 115: V115}
|
| - 116
|
| - LNode {116: V116, 117: V117}
|
| - 118
|
| - LNode {118: V118, 119: V119}
|
| - 120
|
| - LNode {120: V120, 121: V121}
|
| - 122
|
| - LNode {122: V122, 123: V123}
|
| - 124
|
| - LNode {124: V124, 125: V125}
|
| - 126
|
| - LNode {126: V126, 127: V127}
|
| - 128
|
| - LNode {128: V128, 129: V129}
|
| - 130
|
| - LNode {130: V130, 131: V131}
|
| - 132
|
| - LNode {132: V132, 133: V133, 134: V134}
|
| - }
|
| -}
|
| -''');
|
| - expect(tree.remove(100), 'V100');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {101: V101, 102: V102, 103: V103}
|
| - 104
|
| - LNode {104: V104, 105: V105}
|
| - 106
|
| - LNode {106: V106, 107: V107}
|
| - 108
|
| - LNode {108: V108, 109: V109}
|
| - 110
|
| - LNode {110: V110, 111: V111}
|
| - 112
|
| - LNode {112: V112, 113: V113}
|
| - 114
|
| - LNode {114: V114, 115: V115}
|
| - 116
|
| - LNode {116: V116, 117: V117}
|
| - }
|
| - 118
|
| - INode {
|
| - LNode {118: V118, 119: V119}
|
| - 120
|
| - LNode {120: V120, 121: V121}
|
| - 122
|
| - LNode {122: V122, 123: V123}
|
| - 124
|
| - LNode {124: V124, 125: V125}
|
| - 126
|
| - LNode {126: V126, 127: V127}
|
| - 128
|
| - LNode {128: V128, 129: V129}
|
| - 130
|
| - LNode {130: V130, 131: V131}
|
| - 132
|
| - LNode {132: V132, 133: V133, 134: V134}
|
| - }
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_inner_mergeLeft() {
|
| - _insertValues(15);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - }
|
| - 6
|
| - INode {
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9}
|
| - 10
|
| - LNode {10: V10, 11: V11}
|
| - 12
|
| - LNode {12: V12, 13: V13, 14: V14}
|
| - }
|
| -}
|
| -''');
|
| - expect(tree.remove(12), 'V12');
|
| - expect(tree.remove(13), 'V13');
|
| - expect(tree.remove(14), 'V14');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - }
|
| - 6
|
| - INode {
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9}
|
| - 10
|
| - LNode {10: V10, 11: V11}
|
| - }
|
| -}
|
| -''');
|
| - expect(tree.remove(8), 'V8');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 9: V9}
|
| - 10
|
| - LNode {10: V10, 11: V11}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_inner_mergeRight() {
|
| - _insertValues(12);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - }
|
| - 6
|
| - INode {
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 10: V10, 11: V11}
|
| - }
|
| -}
|
| -''');
|
| - expect(tree.remove(0), 'V0');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {1: V1, 2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 10: V10, 11: V11}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_inner_notFound() {
|
| - _insertValues(20);
|
| - expect(tree.remove(100), isNull);
|
| - }
|
| -
|
| - void test_remove_leafRoot_becomesEmpty() {
|
| - _insertValues(1);
|
| - _assertDebugString(tree, 'LNode {0: V0}\n');
|
| - expect(tree.remove(0), 'V0');
|
| - _assertDebugString(tree, 'LNode {}\n');
|
| - }
|
| -
|
| - void test_remove_leafRoot_first() {
|
| - _insertValues(3);
|
| - _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
|
| - expect(tree.remove(0), 'V0');
|
| - _assertDebugString(tree, 'LNode {1: V1, 2: V2}\n');
|
| - }
|
| -
|
| - void test_remove_leafRoot_last() {
|
| - _insertValues(3);
|
| - _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
|
| - expect(tree.remove(2), 'V2');
|
| - _assertDebugString(tree, 'LNode {0: V0, 1: V1}\n');
|
| - }
|
| -
|
| - void test_remove_leafRoot_middle() {
|
| - _insertValues(3);
|
| - _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
|
| - expect(tree.remove(1), 'V1');
|
| - _assertDebugString(tree, 'LNode {0: V0, 2: V2}\n');
|
| - }
|
| -
|
| - void test_remove_leafRoot_notFound() {
|
| - _insertValues(1);
|
| - _assertDebugString(tree, 'LNode {0: V0}\n');
|
| - expect(tree.remove(10), null);
|
| - _assertDebugString(tree, 'LNode {0: V0}\n');
|
| - }
|
| -
|
| - void test_remove_leaf_borrowLeft() {
|
| - tree = _createTree(10, 10);
|
| - for (int i = 20; i < 40; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - for (int i = 0; i < 5; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21, 22: V22, 23: V23, 24: V24}
|
| - 25
|
| - LNode {25: V25, 26: V26, 27: V27, 28: V28, 29: V29}
|
| - 30
|
| - LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
|
| -}
|
| -''');
|
| - expect(tree.remove(25), 'V25');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21}
|
| - 22
|
| - LNode {22: V22, 23: V23, 24: V24, 26: V26, 27: V27, 28: V28, 29: V29}
|
| - 30
|
| - LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_leaf_borrowRight() {
|
| - tree = _createTree(10, 10);
|
| - _insertValues(15);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4}
|
| - 5
|
| - LNode {5: V5, 6: V6, 7: V7, 8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
|
| -}
|
| -''');
|
| - expect(tree.remove(0), 'V0');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {1: V1, 2: V2, 3: V3, 4: V4, 5: V5, 6: V6, 7: V7}
|
| - 8
|
| - LNode {8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_leaf_mergeLeft() {
|
| - _insertValues(9);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 8: V8}
|
| -}
|
| -''');
|
| - expect(tree.remove(2), 'V2');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 8: V8}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_leaf_mergeRight() {
|
| - _insertValues(9);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 8: V8}
|
| -}
|
| -''');
|
| - expect(tree.remove(1), 'V1');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 2: V2, 3: V3}
|
| - 4
|
| - LNode {4: V4, 5: V5}
|
| - 6
|
| - LNode {6: V6, 7: V7, 8: V8}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_remove_leaf_noReorder() {
|
| - _insertValues(5);
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 3: V3, 4: V4}
|
| -}
|
| -''');
|
| - expect(tree.remove(3), 'V3');
|
| - _assertDebugString(tree, '''
|
| -INode {
|
| - LNode {0: V0, 1: V1}
|
| - 2
|
| - LNode {2: V2, 4: V4}
|
| -}
|
| -''');
|
| - }
|
| -
|
| - void test_stress_evenOdd() {
|
| - int count = 1000;
|
| - // insert odd, forward
|
| - for (int i = 1; i < count; i += 2) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - // insert even, backward
|
| - for (int i = count - 2; i >= 0; i -= 2) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - // find every
|
| - for (int i = 0; i < count; i++) {
|
| - expect(tree.find(i), 'V$i');
|
| - }
|
| - // remove odd, backward
|
| - for (int i = count - 1; i >= 1; i -= 2) {
|
| - expect(tree.remove(i), 'V$i');
|
| - }
|
| - for (int i = 0; i < count; i++) {
|
| - if (i.isEven) {
|
| - expect(tree.find(i), 'V$i');
|
| - } else {
|
| - expect(tree.find(i), isNull);
|
| - }
|
| - }
|
| - // remove even, forward
|
| - for (int i = 0; i < count; i += 2) {
|
| - tree.remove(i);
|
| - }
|
| - for (int i = 0; i < count; i++) {
|
| - expect(tree.find(i), isNull);
|
| - }
|
| - }
|
| -
|
| - void test_stress_random() {
|
| - tree = _createTree(10, 10);
|
| - int maxKey = 1000000;
|
| - int tryCount = 1000;
|
| - Set<int> keys = new Set<int>();
|
| - {
|
| - Random random = new Random(37);
|
| - for (int i = 0; i < tryCount; i++) {
|
| - int key = random.nextInt(maxKey);
|
| - keys.add(key);
|
| - _insert(key, 'V$key');
|
| - }
|
| - }
|
| - // find every
|
| - for (int key in keys) {
|
| - expect(tree.find(key), 'V$key');
|
| - }
|
| - // remove random keys
|
| - {
|
| - Random random = new Random(37);
|
| - for (int key in new Set<int>.from(keys)) {
|
| - if (random.nextBool()) {
|
| - keys.remove(key);
|
| - expect(tree.remove(key), 'V$key');
|
| - }
|
| - }
|
| - }
|
| - // find every remaining key
|
| - for (int key in keys) {
|
| - expect(tree.find(key), 'V$key');
|
| - }
|
| - }
|
| -
|
| - void _insert(int key, String value) {
|
| - tree.insert(key, value);
|
| - }
|
| -
|
| - void _insertValues(int count) {
|
| - for (int i = 0; i < count; i++) {
|
| - _insert(i, 'V$i');
|
| - }
|
| - }
|
| -}
|
| -
|
| -class _TestBTree<K, V> extends BPlusTree<K, V, int> {
|
| - _TestBTree(int maxIndexKeys, int maxLeafKeys, Comparator<K> comparator) :
|
| - super(comparator, new MemoryNodeManager(maxIndexKeys, maxLeafKeys));
|
| -}
|
|
|