stdlib : AbstractString/String, Added trim function and unit test
authorLucas Bajolet <lucas.bajolet@hotmail.com>
Mon, 10 Jun 2013 16:19:20 +0000 (12:19 -0400)
committerLucas Bajolet <lucas.bajolet@hotmail.com>
Tue, 25 Jun 2013 15:39:12 +0000 (11:39 -0400)
Signed-off-by: Lucas Bajolet <lucas.bajolet@hotmail.com>

lib/standard/string.nit
tests/sav/string_trim.sav [new file with mode: 0644]
tests/string_trim.nit [new file with mode: 0644]

index 33ad83b..e707454 100644 (file)
@@ -177,6 +177,25 @@ abstract class AbstractString
                return s.to_s
        end
 
+       # Trims trailing and preceding white spaces
+       # A whitespace is defined as any character which ascii value is less than or equal to 32
+       fun trim: String
+       do
+               if self._length == 0 then return self.to_s
+               # find position of the first non white space char (ascii < 32) from the start of the string
+               var start_pos = 0
+               while self[start_pos].ascii <= 32 do
+                       start_pos += 1
+                       if start_pos == _length then return ""
+               end
+               # find position of the first non white space char from the end of the string
+               var end_pos = length - 1
+               while self[end_pos].ascii <= 32 do
+                       end_pos -= 1
+                       if end_pos == start_pos then return self[start_pos].to_s
+               end
+               return self.substring(start_pos, end_pos - start_pos + 1)
+       end
 
        redef fun output
        do
@@ -331,6 +350,26 @@ class String
                return new String.with_native(outstr, self._length)
        end
 
+       redef fun trim: String
+       do
+               if self._length == 0 then return self
+               # find position of the first non white space char (ascii < 32) from the start of the string
+               var start_pos = self._index_from
+               while _items[start_pos].ascii <= 32 do
+                       start_pos += 1
+                       if start_pos == _index_to + 1 then return ""
+               end
+               # find position of the first non white space char from the end of the string
+               var end_pos = _index_to
+               while _items[end_pos].ascii <= 32 do
+                       end_pos -= 1
+                       if end_pos == start_pos then return _items[start_pos].to_s
+               end
+               start_pos -= index_from
+               end_pos -= index_from
+               return self.substring(start_pos, end_pos - start_pos + 1)
+       end
+
        redef fun output
        do
                var i = self._index_from
diff --git a/tests/sav/string_trim.sav b/tests/sav/string_trim.sav
new file mode 100644 (file)
index 0000000..24d9987
--- /dev/null
@@ -0,0 +1,13 @@
+resulttrim = nono nono
+returntrim + nono nono
+thirdtrim = nono nono
+emptytrim = 
+bufferemptytrim = 
+onelettertrim = d
+oneletterbuftest = d
+twolettertrim = hg
+twoletterbuftest = hg
+firstlettertrimtest = d
+firstlettertrimbuftest = d
+lastlettertrimtest = d
+lastlettertrimbuftest = d
diff --git a/tests/string_trim.nit b/tests/string_trim.nit
new file mode 100644 (file)
index 0000000..09bd541
--- /dev/null
@@ -0,0 +1,53 @@
+module string_trim
+
+var trimtest = "   \t nono nono   \n \t"
+
+var subtrim = trimtest.substring(2,15)
+
+var buffertrimtest = new Buffer.from(trimtest)
+
+print "resulttrim = {buffertrimtest.trim}"
+
+print "returntrim + {trimtest.trim}"
+
+print "thirdtrim = {subtrim.trim}"
+
+var emptytrim = "         \t  "
+
+var bufferemptytest = new Buffer.from(emptytrim)
+
+print "emptytrim = {emptytrim.trim}"
+
+print "bufferemptytrim = {bufferemptytest.trim}"
+
+var onelettertrim = "    \n   d      \n\t  "
+
+var oneletterbuftest = new Buffer.from(onelettertrim)
+
+print "onelettertrim = {onelettertrim.trim}"
+
+print "oneletterbuftest = {oneletterbuftest.trim}"
+
+var twolettertrim = "    \n   hg      \n\t  "
+
+var twoletterbuftest = new Buffer.from(twolettertrim)
+
+print "twolettertrim = {twolettertrim.trim}"
+
+print "twoletterbuftest = {twoletterbuftest.trim}"
+
+var firstlettertrim = "d                "
+
+var firstlettertrimbuf = new Buffer.from(firstlettertrim)
+
+print "firstlettertrimtest = {firstlettertrim.trim}"
+
+print "firstlettertrimbuftest = {firstlettertrimbuf.trim}"
+
+var lastlettertrim = "                     d"
+
+var lastlettertrimbuf = new Buffer.from(lastlettertrim)
+
+print "lastlettertrimtest = {lastlettertrim.trim}"
+
+print "lastlettertrimbuftest = {lastlettertrimbuf.trim}"