Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfdf68c2

Browse files
committed
refactor parser to capture multiple failures
1 parentc176913 commitfdf68c2

File tree

2 files changed

+72
-25
lines changed

2 files changed

+72
-25
lines changed

‎src/services/testRunner/parser.test.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,20 @@
11
importparserfrom'./parser'
22

33
describe('parser',()=>{
4-
test('shoulddetect success',()=>{
4+
test('shouldpass single success',()=>{
55
constexample=`
6-
1..2
6+
1..1
77
ok 1 - Should pass
8-
ok 2 - Should also pass
98
`
10-
expect(parser(example)).toEqual({ok:true})
9+
expect(parser(example)).toEqual({ok:true,fails:[]})
1110
})
12-
test('should detectfailure',()=>{
11+
test('should detectmultiple successes',()=>{
1312
constexample=`
14-
1..3
13+
1..2
1514
ok 1 - Should pass
16-
not ok 2 - This one fails
17-
ok 3 - Also passes
15+
ok 2 - Should also pass
1816
`
19-
expect(parser(example).ok).toBe(false)
17+
expect(parser(example)).toEqual({ok:true,fails:[]})
2018
})
2119
test('should detect failure if no tests passed',()=>{
2220
constexample=`
@@ -26,6 +24,15 @@ ok 3 - Also passes
2624
# FAIL __tests__/sum.test.js
2725
2826
not ok 1 ● sum › should add two numbers together
27+
`
28+
expect(parser(example).ok).toBe(false)
29+
})
30+
test('should detect single failure among successes',()=>{
31+
constexample=`
32+
1..3
33+
ok 1 - Should pass
34+
not ok 2 - This one fails
35+
ok 3 - Also passes
2936
`
3037
expect(parser(example).ok).toBe(false)
3138
})
@@ -37,7 +44,7 @@ not ok 2 - First to fail
3744
ok 3 - Also passes
3845
not ok 4 - Second to fail
3946
`
40-
expect(parser(example).message).toBe('First to fail')
47+
expect(parser(example).fails).toEqual([{message:'First to fail'},{message:'Second to fail'}])
4148
})
4249

4350
test('should parse mocha tap example',()=>{
@@ -65,6 +72,6 @@ ok 3 sumItems should total numbers accurately
6572
# fail 1
6673
# skip 0
6774
`
68-
expect(parser(example).message).toBe("sumItems shouldn't return NaN")
75+
expect(parser(example).fails).toEqual([{message:"sumItems shouldn't return NaN"}])
6976
})
7077
})

‎src/services/testRunner/parser.ts

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,69 @@
11
interfaceParserOutput{
22
ok:boolean
3-
message?:string
3+
fails:Array<{message:string;details?:string}>
44
}
55

6-
constfail=/^notok\d+\s(\-\s)?(.+)+$/
7-
constok=/^ok/
6+
constr={
7+
fail:/^notok\d+\s(\-\s)?(.+)+$/,
8+
pass:/^ok/,
9+
details:/^#\s{2}(.+)$/,
10+
}
11+
12+
constdetect=(type:'fail'|'pass'|'details',text:string)=>r[type].exec(text)
813

914
constparser=(text:string):ParserOutput=>{
1015
constlines=text.split('\n')
11-
lethasPass=false
16+
17+
constresult:ParserOutput={
18+
ok:false,
19+
fails:[],
20+
}
21+
22+
// temporary holder of error detail strings
23+
letcurrentDetails:string|null=null
24+
25+
constaddCurrentDetails=()=>{
26+
if(currentDetails){
27+
result.fails[result.fails.length-1].details=currentDetails
28+
currentDetails=null
29+
}
30+
}
31+
1232
for(constlineoflines){
13-
if(line.length){
14-
// parse failed test
15-
constfailRegex=fail.exec(line)
16-
if(!!failRegex){
17-
return{ok:false,message:failRegex[2]}
33+
if(!line.length){
34+
continue
35+
}
36+
// be optimistic! check for success
37+
if(!result.ok&&!result.fails.length){
38+
if(!!detect('pass',line)){
39+
result.ok=true
40+
addCurrentDetails()
41+
continue
1842
}
19-
if(!hasPass){
20-
if(!!ok.exec(line)){
21-
hasPass=true
22-
}
43+
}
44+
45+
// check for failure
46+
constisFail=detect('fail',line)
47+
if(!!isFail){
48+
result.ok=false
49+
result.fails.push({message:isFail[2]})
50+
addCurrentDetails()
51+
continue
52+
}
53+
54+
// check for error details
55+
constisDetails=detect('details',line)
56+
if(!!isDetails){
57+
constlineDetails:string=isDetails[2]
58+
if(!currentDetails){
59+
currentDetails=lineDetails
60+
}else{
61+
//@ts-ignore ignore as it must be a string
62+
currentDetails+=`\n${lineDetails}`
2363
}
2464
}
2565
}
26-
return{ok:hasPass}
66+
returnresult
2767
}
2868

2969
exportdefaultparser

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp