#
#  Copyright (c) 2002 by The XFree86 Project, Inc.
#
#  Permission is hereby granted, free of charge, to any person obtaining a
#  copy of this software and associated documentation files (the "Software"),
#  to deal in the Software without restriction, including without limitation
#  the rights to use, copy, modify, merge, publish, distribute, sublicense,
#  and/or sell copies of the Software, and to permit persons to whom the
#  Software is furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included in
#  all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#  THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
#  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
#  OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
#  SOFTWARE.
#
#  Except as contained in this notice, the name of the XFree86 Project shall
#  not be used in advertising or otherwise to promote the sale, use or other
#  dealings in this Software without prior written authorization from the
#  XFree86 Project.
#
#  Author: Paulo César Pereira de Andrade
#
#
# $XFree86: xc/programs/xedit/lisp/re/tests.txt,v 1.3 2002/11/08 08:01:00 paulo Exp $

# Some tests for the library:
#	lines starting with # are comments
#	lines starting with / are a regular expression pattern
#		The pattern must end with / and may be followed by:
#			i -> ignore case
#			n -> create newline sensitive regex
#	lines starting with > are a string input to the last pattern
#		To test newline sensitive matching, add \n to the string.
#	lines starting with a number are the expected result
#		If more than one line, every subsequent line is the
#		value of an "subresult".
#	:NOMATCH means that the string input should not match

# Simple string
/abc/
>abc
0,3: abc
>aaaaaaaaaaaaaaabc
14,17: abc
>xxxxxxxxxxxxxxaaaaaaaaaaaaaaaaabcxx
30,33: abc

# String list
/abc|bcd|cde/
>abc
0,3: abc
>aabc
1,4: abc
>xxxbcdef
3,6: bcd
>abdzzzcdabcde
8,11: abc
>xxxxabdecdabdcde
13,16: cde

# Complex string
/a?bc|ab?c|abc?/
>abc
0,3: abc
>xxxb
:NOMATCH
>xxxbc
3,5: bc
>sssssab
5,7: ab

# Another complex string
/a*bc|ab*c|abc*/
>aaaaaaabc
0,9: aaaaaaabc
>xaaaaaaabc
1,10: aaaaaaabc
>xyzaaaaaaabc
3,12: aaaaaaabc
>abbc
0,4: abbc
>xxabbbbbc
2,9: abbbbbc
>abcccccccccc
0,12: abcccccccccc
>abccccccccccd
0,12: abcccccccccc
>xxxxxxxaaaaaaaaaabbbbbbbbbbbccccccccccc
16,29: abbbbbbbbbbbc
>xxxbbbbbbbbbc
11,13: bc

# Another complex string
/a+bc|ab+c|abc+/
>xxxbc
:NOMATCH
>xaaabc
1,6: aaabc
>zzzzaaaaabbc
8,12: abbc
>zzzzaaaabbbbbbcccc
7,15: abbbbbbc

# Simple pattern
/a.c/
>abc
0,3: abc
>aaac
1,4: aac
>xac
:NOMATCH
>xaac
1,4: aac
>xxabc
2,5: abc
>xxxaxc
3,6: axc

# Another simple pattern
/a*c/
>c
0,1: c
>xxxxxxxxc
8,9: c
>xxxxxxxcc
7,8: c
>ac
0,2: ac
>aaaac
0,5: aaaac
>xac
1,3: ac
>xxxaac
3,6: aac
>xxac
2,4: ac
>xxxxac
4,6: ac

# Another simple pattern
/a+c/
>xxaac
2,5: aac
>xxxaaaac
3,8: aaaac
>xaaaabac
6,8: ac
>xxxc
:NOMATCH
>xxxxaaaaccc
4,9: aaaac

# Another simple pattern
/a{4}b/
>xabxxaabxxxaaabxxxxaaaab
19,24: aaaab
>aaabaaaab
4,9: aaaab

# Another simple pattern
/a{4,}b/
>xxxaaaab
3,8: aaaab
>zaaabzzzaaaaaaaaaaaaaaaab
8,25: aaaaaaaaaaaaaaaab

# Another simple pattern
/a{,4}b/
>b
0,1: b
>xxxxxxxxb
8,9: b
>xaaaaaaaaab
6,11: aaaab
>xxxab
3,5: ab
>aaaaaxaaab
6,10: aaab

# Another simple pattern
/a{2,4}b/
>xab
:NOMATCH
>xaab
1,4: aab
>xaaab
1,5: aaab
>xxaaaab
2,7: aaaab
>xxxaaaaab
4,9: aaaab

# Some simple grouping tests
/foo(bar|baz)fee/
>feebarbazfoobarfee
9,18: foobarfee
12,15: bar
>foofooobazfeefoobazfee
13,22: foobazfee
/f(oo|ee)ba[rz]/
>barfoebaz
:NOMATCH
>bazfoobar
3,9: foobar
4,6: oo
>barfeebaz
3,9: feebaz
4,6: ee
/\<(int|char)\>/
>aint character int foo
15,18: int
15,18: int

# Some complex repetitions
/foo.*bar/
>barfoblaboofoobarfoobarfoobar
11,17: foobar
/foo.+bar/
>foobar
:NOMATCH
>fobbarfooxbarfooybar
6,13: fooxbar
/foo.?bar/
>xfoobar
1,7: foobar
>xxfooxxbar
:NOMATCH
>yyyfootbar
3,10: footbar

# Some nested complex repetitions
/a.*b.*c/
>abc
0,3: abc
>xxxxxxxxxabbbbbbbccaaaaabbbc
9,18: abbbbbbbc
/a.+b.*c/
>xxxabc 
:NOMATCH
>xxaxbbc
2,7: axbbc
/a.+b.?c/
>xaabc
1,5: aabc
>xxaabbc
2,7: aabbc

# Very complex repetitions
/(foo.*|bar)fee/
# XXX NOTE
# This pattern does not return the correct offset for the group.
# Support for this may and may not be added.

>barfoofee
3,9: foofee
>foobarfee
0,9: foobarfee
>xxfobarfee
4,10: barfee
>barfooooooobarfee
3,17: fooooooobarfee
>xxfobarfeefoobar
4,10: barfee
/(foo.+|bar)fee/
>barfoofee
:NOMATCH
>barfooxfee
3,10: fooxfee
/(foo.?|bar)fee/
>foobar
:NOMATCH
>bafoofee
2,8:foofee
>bafooofeebarfee
2,9: fooofee
>bafoofeebarfee
2,8: foofee

# Simple backreference
/(a|b|c)\1/
>aa
0,2: aa
0,1: a
/(a|b|c)(a|b|c)\1\2/
>acac
0,4: acac
0,1: a
1,2: c
>xxxxacac
4,8: acac
4,5: a
5,6: c
>xxacabacbcacbbacbcaaccabcaca
24,28: caca
24,25: c
25,26: a
>xyabcccc
4,8: cccc
4,5: c
5,6: c

# Complex backreference
/(a*b)\1/
>xxxaaaaabaaaaab
3,15: aaaaabaaaaab
3,9: aaaaab
/(ab+c)\1/
>xaaabbbcabbbc
3,13: abbbcabbbc
3,8: abbbc
/(ab?c)\1/
>abcac
:NOMATCH
>abcacabcabc
5,11: abcabc
5,8: abc
>abcacac
3,7: acac
3,5: acac

# Very complex backreference
/a(.*)b\1/
>xxxab
3,5: ab
4,4: 
>xxxxazzzbzzz
4,12: azzzbzzz
5,8: zzz

# Case testing
/abc/i
>AbC
0,3: AbC
/[0-9][a-z]+/i
>xxx0aaZxYT9
3,10: 0aaZxYT
/a.b/i
>aaaaaaaaaaaxB
10,13: axB
/a.*z/i
>xxxAaaaaZ
3,9: AaaaaZ
>xxaaaZaaa
2,6: aaaZ
/\<(lambda|defun|defmacro)\>/i
>    (lambda
5,11: lambda
5,11: lambda
/\<(nil|t)\>/i
>it Nil
3,6: Nil
3,6: Nil
/\<(begin|end)\>/i
>beginning the ending EnD
21,24: EnD
21,24: EnD

# Some newline tests
/a.*/n
>a\naaa
0,1:a
>xyza\naa
3,4: a
/a.+/n
>a\naaa
2,5: aaa
>xyza\naa
5,7: aa
/a.?/n
>a\naaa
0,1: a
>xyza\naa
3,4: a

# Newline tests envolving complex patterns
/a.*b.*c/n
>xxaa\nzyacb\nabc
11,14: abc
>xxxab\nabc\nc
6,9: abc
/a.+b.*c/n
>ab\nbc\nabbc
6,10: abbc
/a.?b.*c/n
>ab\ncabbc\ncc
4,8: abbc
/^foo$/n
>bar\nfoobar\nfoo
11,14: foo

# Not so complex test involving a newline...
/^\s*#\s*(define|include)\s+.+/n
>#define\n#include x
8,18: #include x
9,16: include

# Check if large strings are working
/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/
>zzzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzzz
3,259: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~/
>String here: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~/
13,333: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890~


# Some complex repetitions not supported
# Listed here only to make sure the library is not crashing on these
#  Repetitions that match an empty match, or an empty string cannot follow
# a complex repetition. A complex repetition is:
#	.* or .+ or .?
#	.{...} is not supported.
/(.*)(\d*)/
:BADRPT
/(.*).(\d*)/
:BADRPT
/(.*)\<(\d*)/
:BADRPT
/(.*)\s(\d*)/
:BADRPT
/(.*)\D(\d*)/
:BADRPT

# This is a more clear pattern and partially works
/(.*)\D(\d+)/
>abcW12
0,6: abcW12
0,3: abc
4,6: 12
>abcW12abcW12
0,6: abcW12
0,3: abc
4,6: 12
# This wasn't working in the previous version, but now with only minimal
# matches supported, it works.
>abcW12abcW12a
0,6: abcW12
0,3: abc
4,6: 12

# Note the minimal match
/.*\d/
>a1a1a1aaaaaaa
0,2: a1
# Check match offsets
/(.*)\d/
>a1a1a1aaaaaaa
0,2: a1
0,1: a
/.*(\d)/
>a1a1a1aaaaaaa
0,2: a1
1,2: 1

/.*(\d+)/
:BADRPT
