call vimtest#StartTap()
call vimtap#Plan(19) " <== XXX Keep plan number updated. XXX
let s = 'this is a string'
let S = string#scanner(s)
call Is(S.skip('\w\+') , 4 , 'skips a word')
call Is(S.skip('\s\+') , 6 , 'skips a space')
call Is(S.skip('\s\+') , -1 , '"fail" if pattern to skip not found')
call Is(S.skip('\w\+') , 8 , 'skips another word')
call Is(S.scan('\w\+') , '' , 'no word to scan here')
call Is(S.index , 8 , 'index unchanged from unsuccessful scan')
call Is(S.skip('\d\+') , -1 , 'no digits to skip')
call Isnt(S.skip('\s\+') , -1 , 'skip over whitespace')
call Is(S.scan('\w\+') , 'a' , 'get next word')
let s = 'this is a string'
let S = string#scanner(s)
call Is(S.skip('\_s\+') , -1 , 'no leading whitespace to skip')
call Is(S.scan('\w\+') , 'this' , 'scan "this"')
call Isnt(S.skip('\s\+') , -1 , 'skip whitespace')
call Is(S.scan('\w\+') , 'is' , 'scan "is"')
call Isnt(S.skip('\s\+') , -1 , 'skip whitespace')
let s = 'this is a string'
let S = string#scanner(s)
call Is(S.skip_until('string') , 10 , 'skips until a target')
call Is(S.scan('\w\+') , 'string' , 'scan collects the pattern match')
let s = "one foo\ntwo foo"
let S = string#scanner(s)
call Is(S.inject("\n").string , "\none foo\ntwo foo" , 'inject at start')
call S.skip('\_s*\w\+')
call Is(S.inject("\n").string , "\none\n foo\ntwo foo" , 'inject inside string')
let s = "one foo\ntwo foo\nthree foo\nfour foo\n"
let S = string#scanner(s)
call Is(S.collect('\n\zs\w\+') , ['one', 'two', 'three', 'four'] , 'collect by pattern')
call vimtest#Quit()