It is possible to have a non nil Interval that is empty. Make the code work on isNil or isEmpty to avoid the exception.
Fixes: SystemExceptions.IndexOutOfRange(Exception)>>signal (ExcHandling.st:254) SystemExceptions.IndexOutOfRange class>>signalOn:withIndex: (SysExcept.st:660) Interval>>first (Interval.st:245) Kernel.MatchingRegexResults>>at: (Regex.st:382) 2013-12-08 Holger Hans Peter Freyther <[email protected]> * kernel/Regex.st: Check for isEmpty of the Interval before trying to use it. 2013-12-08 Holger Hans Peter Freyther <[email protected]> * kernel/RegexpTests.st: Add tests for Regexp. --- ChangeLog | 5 +++ kernel/Regex.st | 7 +++-- packages/kernel-tests/ChangeLog | 4 +++ packages/kernel-tests/Makefile.frag | 2 +- packages/kernel-tests/kernel/RegexpTests.st | 48 +++++++++++++++++++++++++++++ packages/kernel-tests/package.xml | 2 ++ 6 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 packages/kernel-tests/kernel/RegexpTests.st diff --git a/ChangeLog b/ChangeLog index 68c511a..7b6f5e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-12-08 Holger Hans Peter Freyther <[email protected]> + + * kernel/Regex.st: Check for isEmpty of the Interval before + trying to use it. + 2013-12-11 Lee Duhem <[email protected]> * kernel/MappedColl.st: Fix variable name typos in reject: and diff --git a/kernel/Regex.st b/kernel/Regex.st index 91a4ab3..5bc1046 100644 --- a/kernel/Regex.st +++ b/kernel/Regex.st @@ -377,9 +377,12 @@ RegexResults subclass: MatchingRegexResults [ (cache at: anIndex) isNil ifTrue: [reg := registers at: anIndex. - text := reg isNil + text := reg isNil ifTrue: [nil] - ifFalse: [self subject copyFrom: reg first to: reg last]. + ifFalse: [ + reg isEmpty + ifTrue: [''] + ifFalse: [self subject copyFrom: reg first to: reg last]]. cache at: anIndex put: text]. ^cache at: anIndex ] diff --git a/packages/kernel-tests/ChangeLog b/packages/kernel-tests/ChangeLog index ce2e127..532f991 100644 --- a/packages/kernel-tests/ChangeLog +++ b/packages/kernel-tests/ChangeLog @@ -1,3 +1,7 @@ +2013-12-08 Holger Hans Peter Freyther <[email protected]> + + * kernel/RegexpTests.st: Add tests for Regexp. + 2013-12-13 Holger Hans Peter Freyther <[email protected]> * kernel/MappedCollectionTests.st: Add tests for MappedCollection. diff --git a/packages/kernel-tests/Makefile.frag b/packages/kernel-tests/Makefile.frag index 1d19d61..e44befc 100644 --- a/packages/kernel-tests/Makefile.frag +++ b/packages/kernel-tests/Makefile.frag @@ -1,5 +1,5 @@ Kernel-Tests_FILES = \ -packages/kernel-tests/ChangeLog packages/kernel-tests/kernel/CompiledMethodTests.st packages/kernel-tests/kernel/ContextPartTests.st packages/kernel-tests/kernel/MappedCollectionTests.st packages/kernel-tests/kernel/ObjectTests.st +packages/kernel-tests/ChangeLog packages/kernel-tests/kernel/CompiledMethodTests.st packages/kernel-tests/kernel/ContextPartTests.st packages/kernel-tests/kernel/MappedCollectionTests.st packages/kernel-tests/kernel/ObjectTests.st packages/kernel-tests/kernel/RegexpTests.st $(Kernel-Tests_FILES): $(srcdir)/packages/kernel-tests/stamp-classes: $(Kernel-Tests_FILES) touch $(srcdir)/packages/kernel-tests/stamp-classes diff --git a/packages/kernel-tests/kernel/RegexpTests.st b/packages/kernel-tests/kernel/RegexpTests.st new file mode 100644 index 0000000..a239756 --- /dev/null +++ b/packages/kernel-tests/kernel/RegexpTests.st @@ -0,0 +1,48 @@ +TestCase subclass: TestRegexp [ + + testEmptyMatch [ + | data match | + + data := '""'. + match := (data =~ '"([^"]*)"'). + + "Check that it has matched" + self assert: match class equals: Kernel.MatchingRegexResults. + self assert: match matched. + self assert: match size = 1. + self assert: (match at: 1) equals: ''. + + "Check if an exception is thrown" + self shouldnt: [match printString] raise: Exception. + ] + + testMatch [ + | data match | + + data := '"A"'. + match := (data =~ '"([^"]*)"'). + + "Check that it has matched" + self assert: match class equals: Kernel.MatchingRegexResults. + self assert: match matched. + self assert: match size = 1. + self assert: (match at: 1) equals: 'A'. + + "Check if an exception is thrown" + self shouldnt: [match printString] raise: Exception. + ] + + testOptionalMatch [ + | match | + match := 'Mary Jane Emily' =~ '(\w+)( \w+)?( \w+)?( \w+)?( \w+)?'. + + self assert: match class equals: Kernel.MatchingRegexResults. + self assert: match matched. + self assert: match size = 5. + self assert: (match at: 1) equals: 'Mary'. + self assert: (match at: 2) equals: ' Jane'. + self assert: (match at: 3) equals: ' Emily'. + self assert: (match at: 4) equals: nil. + self assert: (match at: 5) equals: nil. + ] +] diff --git a/packages/kernel-tests/package.xml b/packages/kernel-tests/package.xml index 7699d23..18681bb 100644 --- a/packages/kernel-tests/package.xml +++ b/packages/kernel-tests/package.xml @@ -6,10 +6,12 @@ <sunit>TestContextPart</sunit> <sunit>TestMappedCollection</sunit> <sunit>TestObject</sunit> + <sunit>TestRegexp</sunit> <filein>kernel/CompiledMethodTests.st</filein> <filein>kernel/ContextPartTests.st</filein> <filein>kernel/MappedCollectionTests.st</filein> <filein>kernel/ObjectTests.st</filein> + <filein>kernel/RegexpTests.st</filein> </test> <file>ChangeLog</file> -- 1.8.4.rc3 _______________________________________________ help-smalltalk mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-smalltalk
