From cef619cb401733ae35e5db3e4ff6b7a8bc1a9028 Mon Sep 17 00:00:00 2001 From: James Roseborough Date: Sun, 27 Jan 2013 18:42:21 +0000 Subject: [PATCH] Improve tests and behavior of string.indexOf operations. --- src/core/org/luaj/vm2/LuaString.java | 16 ++- test/junit/org/luaj/vm2/StringTest.java | 127 ++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 9 deletions(-) diff --git a/src/core/org/luaj/vm2/LuaString.java b/src/core/org/luaj/vm2/LuaString.java index 731dfa65..e474d6e6 100644 --- a/src/core/org/luaj/vm2/LuaString.java +++ b/src/core/org/luaj/vm2/LuaString.java @@ -501,8 +501,8 @@ public class LuaString extends LuaValue { * @return index of first match found, or -1 if not found. */ public int indexOf( byte b, int start ) { - for ( int i=0, j=m_offset+start; i < m_length; ++i ) { - if ( m_bytes[j++] == b ) + for ( int i=start; i < m_length; ++i ) { + if ( m_bytes[m_offset+i] == b ) return i; } return -1; @@ -517,10 +517,9 @@ public class LuaString extends LuaValue { public int indexOf( LuaString s, int start ) { final int slen = s.length(); final int limit = m_length - slen; - for ( int i = start; i <= limit; ++i ) { - if ( equals( m_bytes, m_offset + i, s.m_bytes, s.m_offset, slen ) ) { + for ( int i=start; i <= limit; ++i ) { + if ( equals( m_bytes, m_offset+i, s.m_bytes, s.m_offset, slen ) ) return i; - } } return -1; } @@ -532,11 +531,10 @@ public class LuaString extends LuaValue { */ public int lastIndexOf( LuaString s ) { final int slen = s.length(); - final int limit = m_offset + m_length - slen; - for ( int i = limit; i >= m_offset; --i ) { - if ( equals( m_bytes, i, s.m_bytes, s.m_offset, slen ) ) { + final int limit = m_length - slen; + for ( int i=limit; i >= 0; --i ) { + if ( equals( m_bytes, m_offset+i, s.m_bytes, s.m_offset, slen ) ) return i; - } } return -1; } diff --git a/test/junit/org/luaj/vm2/StringTest.java b/test/junit/org/luaj/vm2/StringTest.java index 300bec75..b084bf22 100644 --- a/test/junit/org/luaj/vm2/StringTest.java +++ b/test/junit/org/luaj/vm2/StringTest.java @@ -222,4 +222,131 @@ public class StringTest extends TestCase { assertFalse(sub1 == sub2); assertFalse(src.m_bytes == sub1.m_bytes); } + + public void testIndexOfByteInSubstring() { + LuaString str = LuaString.valueOf("abcdef:ghi"); + LuaString sub = str.substring(2, 10); + assertEquals(10, str.m_length); + assertEquals(8, sub.m_length); + assertEquals(0, str.m_offset); + assertEquals(2, sub.m_offset); + + assertEquals(6, str.indexOf((byte) ':', 0)); + assertEquals(6, str.indexOf((byte) ':', 2)); + assertEquals(6, str.indexOf((byte) ':', 6)); + assertEquals(-1, str.indexOf((byte) ':', 7)); + assertEquals(-1, str.indexOf((byte) ':', 9)); + assertEquals(9, str.indexOf((byte) 'i', 0)); + assertEquals(9, str.indexOf((byte) 'i', 2)); + assertEquals(9, str.indexOf((byte) 'i', 9)); + assertEquals(-1, str.indexOf((byte) 'z', 0)); + assertEquals(-1, str.indexOf((byte) 'z', 2)); + assertEquals(-1, str.indexOf((byte) 'z', 9)); + + assertEquals(4, sub.indexOf((byte) ':', 0)); + assertEquals(4, sub.indexOf((byte) ':', 2)); + assertEquals(4, sub.indexOf((byte) ':', 4)); + assertEquals(-1, sub.indexOf((byte) ':', 5)); + assertEquals(-1, sub.indexOf((byte) ':', 7)); + assertEquals(7, sub.indexOf((byte) 'i', 0)); + assertEquals(7, sub.indexOf((byte) 'i', 2)); + assertEquals(7, sub.indexOf((byte) 'i', 7)); + assertEquals(-1, sub.indexOf((byte) 'z', 0)); + assertEquals(-1, sub.indexOf((byte) 'z', 2)); + assertEquals(-1, sub.indexOf((byte) 'z', 7)); + } + + public void testIndexOfPatternInSubstring() { + LuaString str = LuaString.valueOf("abcdef:ghi"); + LuaString sub = str.substring(2, 10); + assertEquals(10, str.m_length); + assertEquals(8, sub.m_length); + assertEquals(0, str.m_offset); + assertEquals(2, sub.m_offset); + + LuaString pat = LuaString.valueOf(":"); + LuaString i = LuaString.valueOf("i"); + LuaString xyz = LuaString.valueOf("xyz"); + + assertEquals(6, str.indexOf(pat, 0)); + assertEquals(6, str.indexOf(pat, 2)); + assertEquals(6, str.indexOf(pat, 6)); + assertEquals(-1, str.indexOf(pat, 7)); + assertEquals(-1, str.indexOf(pat, 9)); + assertEquals(9, str.indexOf(i, 0)); + assertEquals(9, str.indexOf(i, 2)); + assertEquals(9, str.indexOf(i, 9)); + assertEquals(-1, str.indexOf(xyz, 0)); + assertEquals(-1, str.indexOf(xyz, 2)); + assertEquals(-1, str.indexOf(xyz, 9)); + + assertEquals(4, sub.indexOf(pat, 0)); + assertEquals(4, sub.indexOf(pat, 2)); + assertEquals(4, sub.indexOf(pat, 4)); + assertEquals(-1, sub.indexOf(pat, 5)); + assertEquals(-1, sub.indexOf(pat, 7)); + assertEquals(7, sub.indexOf(i, 0)); + assertEquals(7, sub.indexOf(i, 2)); + assertEquals(7, sub.indexOf(i, 7)); + assertEquals(-1, sub.indexOf(xyz, 0)); + assertEquals(-1, sub.indexOf(xyz, 2)); + assertEquals(-1, sub.indexOf(xyz, 7)); + } + + public void testLastIndexOfPatternInSubstring() { + LuaString str = LuaString.valueOf("abcdef:ghi"); + LuaString sub = str.substring(2, 10); + assertEquals(10, str.m_length); + assertEquals(8, sub.m_length); + assertEquals(0, str.m_offset); + assertEquals(2, sub.m_offset); + + LuaString pat = LuaString.valueOf(":"); + LuaString i = LuaString.valueOf("i"); + LuaString xyz = LuaString.valueOf("xyz"); + + assertEquals(6, str.lastIndexOf(pat)); + assertEquals(9, str.lastIndexOf(i)); + assertEquals(-1, str.lastIndexOf(xyz)); + + assertEquals(4, sub.lastIndexOf(pat)); + assertEquals(7, sub.lastIndexOf(i)); + assertEquals(-1, sub.lastIndexOf(xyz)); + } + + public void testIndexOfAnyInSubstring() { + LuaString str = LuaString.valueOf("abcdef:ghi"); + LuaString sub = str.substring(2, 10); + assertEquals(10, str.m_length); + assertEquals(8, sub.m_length); + assertEquals(0, str.m_offset); + assertEquals(2, sub.m_offset); + + LuaString ghi = LuaString.valueOf("ghi"); + LuaString ihg = LuaString.valueOf("ihg"); + LuaString ijk = LuaString.valueOf("ijk"); + LuaString kji= LuaString.valueOf("kji"); + LuaString xyz = LuaString.valueOf("xyz"); + LuaString ABCdEFGHIJKL = LuaString.valueOf("ABCdEFGHIJKL"); + LuaString EFGHIJKL = ABCdEFGHIJKL.substring(4, 12); + LuaString CdEFGHIJ = ABCdEFGHIJKL.substring(2, 10); + assertEquals(4, EFGHIJKL.m_offset); + assertEquals(2, CdEFGHIJ.m_offset); + + assertEquals(7, str.indexOfAny(ghi)); + assertEquals(7, str.indexOfAny(ihg)); + assertEquals(9, str.indexOfAny(ijk)); + assertEquals(9, str.indexOfAny(kji)); + assertEquals(-1, str.indexOfAny(xyz)); + assertEquals(3, str.indexOfAny(CdEFGHIJ)); + assertEquals(-1, str.indexOfAny(EFGHIJKL)); + + assertEquals(5, sub.indexOfAny(ghi)); + assertEquals(5, sub.indexOfAny(ihg)); + assertEquals(7, sub.indexOfAny(ijk)); + assertEquals(7, sub.indexOfAny(kji)); + assertEquals(-1, sub.indexOfAny(xyz)); + assertEquals(1, sub.indexOfAny(CdEFGHIJ)); + assertEquals(-1, sub.indexOfAny(EFGHIJKL)); + } }