Skip to content

Commit 31c4eb8

Browse files
committed
#6679 tests and fixes
1 parent 0248997 commit 31c4eb8

File tree

2 files changed

+183
-32
lines changed

2 files changed

+183
-32
lines changed

src/vs/workbench/parts/markers/common/markersModel.ts

+27-32
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,28 @@
44
*--------------------------------------------------------------------------------------------*/
55
'use strict';
66

7+
import * as strings from 'vs/base/common/strings';
8+
import * as paths from 'vs/base/common/paths';
79
import * as Map from 'vs/base/common/map';
810
import Severity from 'vs/base/common/severity';
911
import URI from 'vs/base/common/uri';
12+
import { Range } from 'vs/editor/common/core/range';
1013
import { IMarker, MarkerStatistics } from 'vs/platform/markers/common/markers';
1114
import {IFilter, or, matchesContiguousSubString, matchesPrefix} from 'vs/base/common/filters';
1215
import Messages from 'vs/workbench/parts/markers/common/messages';
1316

1417
export class Resource {
15-
constructor(public uri: URI, public markers: Marker[], public statistics: MarkerStatistics){};
18+
public name: string;
19+
public path: string;
20+
constructor(public uri: URI, public markers: Marker[], public statistics: MarkerStatistics){
21+
this.path= uri.fsPath;
22+
this.name= paths.basename(uri.fsPath);
23+
}
1624
}
1725

1826
export class Marker {
1927
static _filter: IFilter = or(matchesPrefix, matchesContiguousSubString);
20-
constructor(public id:string, public marker: IMarker){};
28+
constructor(public id:string, public marker: IMarker){}
2129
}
2230

2331
export class MarkersModel {
@@ -34,10 +42,13 @@ export class MarkersModel {
3442
var resources= <Resource[]>this.markersByResource.entries().map(this.toResource.bind(this));
3543
resources= resources.filter((resource) => {return !!resource;});
3644
resources.sort((a: Resource, b: Resource) => {
37-
if (a.statistics.errors > 0 && b.statistics.errors > 0) {
38-
return a.uri.toString().localeCompare(b.uri.toString());
45+
if (a.statistics.errors === 0 && b.statistics.errors > 0) {
46+
return 1;
47+
}
48+
if (b.statistics.errors === 0 && a.statistics.errors > 0) {
49+
return -1;
3950
}
40-
return a.statistics.errors > 0 ? -1 : 1;
51+
return strings.localeCompare(a.path, b.path) || strings.localeCompare(a.name, b.name);
4152
});
4253
return resources;
4354
}
@@ -82,33 +93,17 @@ export class MarkersModel {
8293
}
8394

8495
private compareMarkers(a: Marker, b:Marker): number {
85-
let result= this.compare(a.marker.startLineNumber, b.marker.startLineNumber);
86-
if (result !== 0) {
87-
return result;
88-
}
89-
90-
result= this.compare(a.marker.startColumn, b.marker.startColumn);
91-
if (result !== 0) {
92-
return result;
93-
}
94-
95-
result= this.compare(a.marker.endLineNumber, b.marker.endLineNumber);
96-
if (result !== 0) {
97-
return result;
98-
}
99-
100-
result= this.compare(a.marker.endColumn, b.marker.endColumn);
101-
if (result !== 0) {
102-
return result;
103-
}
104-
105-
return a.marker.message.localeCompare(b.marker.message);
106-
}
107-
108-
private compare(a: number, b: number): number {
109-
return a < b ? -1
110-
: a > b ? 1
111-
: 0;
96+
return Range.compareRangesUsingStarts({
97+
startLineNumber: a.marker.startLineNumber,
98+
startColumn: a.marker.startColumn,
99+
endLineNumber: a.marker.endLineNumber,
100+
endColumn: a.marker.endColumn
101+
}, {
102+
startLineNumber: b.marker.startLineNumber,
103+
startColumn: b.marker.startColumn,
104+
endLineNumber: b.marker.endLineNumber,
105+
endColumn: b.marker.endColumn
106+
});
112107
}
113108

114109
private filterMarker(marker: IMarker):boolean {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
'use strict';
7+
8+
import assert = require('assert');
9+
import URI from 'vs/base/common/uri';
10+
import Severity from 'vs/base/common/severity';
11+
import { IMarker, MarkerStatistics } from 'vs/platform/markers/common/markers';
12+
import { MarkersModel, Marker, Resource } from 'vs/workbench/parts/markers/common/markersModel';
13+
14+
suite('MarkersModel Test', () => {
15+
16+
test('getFilteredResource return markers grouped by resource', function() {
17+
let marker1= aMarker('res1');
18+
let marker2= aMarker('res2');
19+
let marker3= aMarker('res1');
20+
let marker4= aMarker('res3');
21+
let marker5= aMarker('res4');
22+
let marker6= aMarker('res2');
23+
let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6]);
24+
25+
let actuals= testObject.getFilteredResources();
26+
27+
assert.equal(4, actuals.length);
28+
29+
assert.ok(compareResource(actuals[0], 'res1'));
30+
assert.equal(2, actuals[0].markers.length);
31+
assert.ok(hasMarker(actuals[0].markers, marker1));
32+
assert.ok(hasMarker(actuals[0].markers, marker3));
33+
34+
assert.ok(compareResource(actuals[1], 'res2'));
35+
assert.equal(2, actuals[1].markers.length);
36+
assert.ok(hasMarker(actuals[1].markers, marker2));
37+
assert.ok(hasMarker(actuals[1].markers, marker6));
38+
39+
assert.ok(compareResource(actuals[2], 'res3'));
40+
assert.equal(1, actuals[2].markers.length);
41+
assert.ok(hasMarker(actuals[2].markers, marker4));
42+
43+
assert.ok(compareResource(actuals[3], 'res4'));
44+
assert.equal(1, actuals[3].markers.length);
45+
assert.ok(hasMarker(actuals[3].markers, marker5));
46+
});
47+
48+
test('getFilteredResource return markers grouped by resource sorted by file path', function() {
49+
let marker1= aMarker('a/res1');
50+
let marker2= aMarker('a/res2');
51+
let marker3= aMarker('res4');
52+
let marker4= aMarker('b/res3');
53+
let marker5= aMarker('res4');
54+
let marker6= aMarker('c/res2');
55+
let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6]);
56+
57+
let actuals= testObject.getFilteredResources();
58+
59+
assert.equal(5, actuals.length);
60+
assert.ok(compareResource(actuals[0], 'a/res1'));
61+
assert.ok(compareResource(actuals[1], 'a/res2'));
62+
assert.ok(compareResource(actuals[2], 'b/res3'));
63+
assert.ok(compareResource(actuals[3], 'c/res2'));
64+
assert.ok(compareResource(actuals[4], 'res4'));
65+
});
66+
67+
test('getFilteredResource return resources with no errors at the end', function() {
68+
let marker1= aMarker('a/res1', Severity.Warning);
69+
let marker2= aMarker('a/res2');
70+
let marker3= aMarker('res4');
71+
let marker4= aMarker('b/res3');
72+
let marker5= aMarker('res4');
73+
let marker6= aMarker('c/res2', Severity.Info);
74+
let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6]);
75+
76+
let actuals= testObject.getFilteredResources();
77+
78+
assert.equal(5, actuals.length);
79+
assert.ok(compareResource(actuals[0], 'a/res2'));
80+
assert.ok(compareResource(actuals[1], 'b/res3'));
81+
assert.ok(compareResource(actuals[2], 'res4'));
82+
assert.ok(compareResource(actuals[3], 'a/res1'));
83+
assert.ok(compareResource(actuals[4], 'c/res2'));
84+
});
85+
86+
test('getFilteredResource return markers sorted by line and column', function() {
87+
let marker1= aMarkerWithRange(8, 1, 9, 3);
88+
let marker2= aMarkerWithRange(3);
89+
let marker3= aMarkerWithRange(5);
90+
let marker4= aMarkerWithRange(8, 1, 8, 4, 'ab');
91+
let marker5= aMarkerWithRange(10);
92+
let marker6= aMarkerWithRange(8, 1, 8, 4, 'ba');
93+
let marker7= aMarkerWithRange(4);
94+
let marker8= aMarkerWithRange(8, 2, 8, 4);
95+
let testObject= new MarkersModel([marker1, marker2, marker3, marker4, marker5, marker6, marker7, marker8]);
96+
97+
let actuals= testObject.getFilteredResources();
98+
99+
assert.equal(8, actuals[0].markers.length);
100+
assert.equal(actuals[0].markers[0].marker, marker2);
101+
assert.equal(actuals[0].markers[1].marker, marker7);
102+
assert.equal(actuals[0].markers[2].marker, marker3);
103+
104+
assert.equal(actuals[0].markers[3].marker, marker4);
105+
assert.equal(actuals[0].markers[4].marker, marker6);
106+
assert.equal(actuals[0].markers[5].marker, marker1);
107+
assert.equal(actuals[0].markers[6].marker, marker8);
108+
109+
assert.equal(actuals[0].markers[7].marker, marker5);
110+
});
111+
112+
function hasResource(resources:Resource[], resource:string):boolean {
113+
return resources.filter((r):boolean => {
114+
return r.uri.toString() === URI.file(resource).toString();
115+
}).length === 1;
116+
}
117+
118+
function hasMarker(markers:Marker[], marker:IMarker):boolean {
119+
return markers.filter((m):boolean => {
120+
return m.marker === marker;
121+
}).length === 1;
122+
}
123+
124+
function compareResource(a:Resource, b:string):boolean {
125+
return a.uri.toString() === URI.file(b).toString();
126+
}
127+
128+
function aMarkerWithRange(startLineNumber:number=10,
129+
startColumn:number=5,
130+
endLineNumber:number= startLineNumber + 1,
131+
endColumn:number=startColumn + 5,
132+
message: string= 'some message'
133+
):IMarker {
134+
return aMarker('some resource', Severity.Error, startLineNumber, startColumn, endLineNumber, endColumn, message);
135+
}
136+
137+
function aMarker(resource:string='some resource',
138+
severity:Severity=Severity.Error,
139+
startLineNumber:number=10,
140+
startColumn:number=5,
141+
endLineNumber:number= startLineNumber + 1,
142+
endColumn:number=startColumn + 5,
143+
message:string='some message'
144+
):IMarker {
145+
return {
146+
owner: 'someOwner',
147+
resource: URI.file(resource),
148+
severity: severity,
149+
message: message,
150+
startLineNumber: startLineNumber,
151+
startColumn: startColumn,
152+
endLineNumber: endLineNumber,
153+
endColumn: endColumn
154+
}
155+
}
156+
});

0 commit comments

Comments
 (0)