UNPKG

4.65 kBJavaScriptView Raw
1"use strict";
2// *****************************************************************************
3// Copyright (C) 2019 TypeFox and others.
4//
5// This program and the accompanying materials are made available under the
6// terms of the Eclipse Public License v. 2.0 which is available at
7// http://www.eclipse.org/legal/epl-2.0.
8//
9// This Source Code may also be made available under the following Secondary
10// Licenses when the conditions for such availability set forth in the Eclipse
11// Public License v. 2.0 are satisfied: GNU General Public License, version 2
12// with the GNU Classpath Exception which is available at
13// https://www.gnu.org/software/classpath/license.html.
14//
15// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16// *****************************************************************************
17var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
18 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19 if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20 else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
21 return c > 3 && r && Object.defineProperty(target, key, r), r;
22};
23Object.defineProperty(exports, "__esModule", { value: true });
24const assert = require("assert");
25const inversify_1 = require("inversify");
26const tree_test_container_1 = require("./test/tree-test-container");
27const tree_1 = require("./tree");
28const tree_model_1 = require("./tree-model");
29const tree_label_provider_1 = require("./tree-label-provider");
30let ConsistencyTestTree = class ConsistencyTestTree extends tree_1.TreeImpl {
31 constructor() {
32 super(...arguments);
33 this.resolveCounter = 0;
34 }
35 async resolveChildren(parent) {
36 if (parent.id === 'expandable') {
37 const step = async () => {
38 // a predicate to emulate bad timing, i.e.
39 // children of a node gets resolved when a root is changed
40 if (this.root && this.root !== parent.parent) {
41 this.resolveCounter++;
42 return [];
43 }
44 else {
45 await new Promise(resolve => setTimeout(resolve, 10));
46 return step();
47 }
48 };
49 return step();
50 }
51 return super.resolveChildren(parent);
52 }
53};
54ConsistencyTestTree = __decorate([
55 (0, inversify_1.injectable)()
56], ConsistencyTestTree);
57/**
58 * Return roots having the same id, but not object identity.
59 */
60function createConsistencyTestRoot(rootName) {
61 const children = [];
62 const root = {
63 id: 'root',
64 name: rootName,
65 parent: undefined,
66 children
67 };
68 const parent = {
69 id: 'expandable',
70 name: 'expandable',
71 parent: root,
72 expanded: true,
73 children: []
74 };
75 children.push(parent);
76 return root;
77}
78describe('Tree Consistency', () => {
79 it('setting different tree roots should finish', async () => {
80 const container = (0, tree_test_container_1.createTreeTestContainer)();
81 container.bind(tree_label_provider_1.TreeLabelProvider).toSelf().inSingletonScope();
82 const labelProvider = container.get(tree_label_provider_1.TreeLabelProvider);
83 container.bind(ConsistencyTestTree).toSelf();
84 container.rebind(tree_1.TreeImpl).toService(ConsistencyTestTree);
85 const tree = container.get(ConsistencyTestTree);
86 const model = container.get(tree_model_1.TreeModel);
87 model.root = createConsistencyTestRoot('Foo');
88 await new Promise(resolve => setTimeout(resolve, 50));
89 model.root = createConsistencyTestRoot('Bar');
90 await new Promise(resolve => setTimeout(resolve, 50));
91 let resolveCounter = tree.resolveCounter;
92 assert.deepStrictEqual(tree.resolveCounter, 1);
93 for (let i = 0; i < 10; i++) {
94 await new Promise(resolve => setTimeout(resolve, 50));
95 if (resolveCounter === tree.resolveCounter) {
96 assert.deepStrictEqual(tree.resolveCounter, 1);
97 assert.deepStrictEqual(labelProvider.getName(model.root), 'Bar');
98 return;
99 }
100 resolveCounter = tree.resolveCounter;
101 }
102 assert.ok(false, 'Resolving does not stop, attempts: ' + tree.resolveCounter);
103 });
104});
105//# sourceMappingURL=tree-consistency.spec.js.map
\No newline at end of file