// Copyright (c) 2019 Alexander Medvednikov. All rights reserved. // Use of this source code is governed by an MIT license // that can be found in the LICENSE file. fn test_add() { mut a := 'a' a += 'b' assert a==('ab') a = 'a' for i := 1; i < 1000; i++ { a += 'b' } assert a.len == 1000 assert a.ends_with('bbbbb') a += '123' assert a.ends_with('3') } fn test_ends_with() { a := 'browser.v' assert a.ends_with('.v') } fn test_between() { s := 'hello [man] how you doing' assert s.find_between('[', ']') == 'man' } fn test_compare() { a := 'Music' b := 'src' assert b>=(a) } fn test_lt() { a := '' b := 'a' c := 'a' d := 'b' e := 'aa' f := 'ab' assert a < (b) assert !(b < c) assert c < (d) assert !(d < e) assert c < (e) assert e < (f) } fn test_ge() { a := 'aa' b := 'aa' c := 'ab' d := 'abc' e := 'aaa' assert b >= (a) assert c >= (b) assert d >= (c) assert !(c >= d) assert e >= (a) } fn test_compare_strings() { a := 'aa' b := 'aa' c := 'ab' d := 'abc' e := 'aaa' assert compare_strings(a, b) == 0 assert compare_strings(b, c) == -1 assert compare_strings(c, d) == -1 assert compare_strings(d, e) == 1 assert compare_strings(a, e) == -1 assert compare_strings(e, a) == 1 } fn test_sort() { mut vals := [ 'arr', 'an', 'a', 'any' ] len := vals.len vals.sort() assert len == vals.len assert vals[0] == 'a' assert vals[1] == 'an' assert vals[2] == 'any' assert vals[3] == 'arr' } fn test_split_nth() { a := "1,2,3" assert (a.split(',').len == 3) assert (a.split_nth(',', -1).len == 3) assert (a.split_nth(',', 0).len == 3) assert (a.split_nth(',', 1).len == 1) assert (a.split_nth(',', 2).len == 2) assert (a.split_nth(',', 10).len == 3) b := "1::2::3" assert (b.split('::').len == 3) assert (b.split_nth('::', -1).len == 3) assert (b.split_nth('::', 0).len == 3) assert (b.split_nth('::', 1).len == 1) assert (b.split_nth('::', 2).len == 2) assert (b.split_nth('::', 10).len == 3) c := "ABCDEF" assert (c.split('').len == 6) assert (c.split_nth('', 3).len == 3) assert (c.split_nth('BC', -1).len == 2) d := "," assert (d.split(',').len == 2) assert (d.split_nth('', 3).len == 1) assert (d.split_nth(',', -1).len == 2) assert (d.split_nth(',', 3).len == 2) e := ",,,0,,,,,a,,b," // assert (e.split(',,').len == 5) // assert (e.split_nth(',,', 3).len == 2) assert (e.split_nth(',', -1).len == 12) assert (e.split_nth(',', 3).len == 3) } fn test_split() { mut s := 'volt/twitch.v:34' mut vals := s.split(':') assert vals.len == 2 assert vals[0] == 'volt/twitch.v' assert vals[1] == '34' // ///////// s = '2018-01-01z13:01:02' vals = s.split('z') assert vals.len == 2 assert vals[0] =='2018-01-01' assert vals[1] == '13:01:02' // ////////// s = '4627a862c3dec29fb3182a06b8965e0025759e18___1530207969___blue' vals = s.split('___') assert vals.len == 3 assert vals[0]== '4627a862c3dec29fb3182a06b8965e0025759e18' assert vals[1]=='1530207969' assert vals[2]== 'blue' // ///////// s = 'lalala' vals = s.split('a') assert vals.len == 4 assert vals[0] == 'l' assert vals[1] == 'l' assert vals[2] == 'l' assert vals[3] == '' // ///////// s = 'awesome' a := s.split('') assert a.len == 7 assert a[0] == 'a' assert a[1] == 'w' assert a[2] == 'e' assert a[3] == 's' assert a[4] == 'o' assert a[5] == 'm' assert a[6] == 'e' } fn test_trim_space() { a := ' a ' assert a.trim_space() == 'a' code := ' fn main() { println(2) } ' code_clean := 'fn main() { println(2) }' assert code.trim_space() == code_clean } fn test_join() { mut strings := [ 'a', 'b', 'c' ] mut s := strings.join(' ') assert s == 'a b c' strings = ['one two ', 'three! four!'] s = strings.join(' ') assert s.contains('one') && s.contains('two ') && s.contains('four') } fn test_clone() { mut a := 'a' a += 'a' a += 'a' b := a c := a.clone() assert c == a assert c == 'aaa' assert b == 'aaa' } fn test_replace() { a := 'hello man!' mut b := a.replace('man', 'world') assert b==('hello world!') b = b.replace('!', '') assert b==('hello world') b = b.replace('h', 'H') assert b==('Hello world') b = b.replace('foo', 'bar') assert b==('Hello world') s := 'hey man how are you' assert s.replace('man ', '') == 'hey how are you' lol := 'lol lol lol' assert lol.replace('lol', 'LOL') == 'LOL LOL LOL' b = 'oneBtwoBBthree' assert b.replace('B', '') == 'onetwothree' b = '*charptr' assert b.replace('charptr', 'byteptr') == '*byteptr' c :='abc' assert c.replace('','-') == c } fn test_itoa() { num := 777 assert num.str() == '777' big := 7779998 assert big.str() == '7779998' a := 3 assert a.str() == '3' b := 5555 assert b.str() == '5555' zero := 0 assert zero.str() == '0' neg := -7 assert neg.str() == '-7' } fn test_reassign() { a := 'hi' mut b := a b += '!' assert a == 'hi' assert b == 'hi!' } fn test_runes() { s := 'привет' assert s.len == 12 s2 := 'privet' assert s2.len == 6 u := s.ustring() assert u.len == 6 assert s2.substr(1, 4).len == 3 assert s2.substr(1, 4) == 'riv' assert s2[1..4].len == 3 assert s2[1..4] == 'riv' assert s2[..4].len == 4 assert s2[..4] == 'priv' assert s2[2..].len == 4 assert s2[2..] == 'ivet' assert u.substr(1, 4).len == 6 assert u.substr(1, 4) == 'рив' assert s2.substr(1, 2) == 'r' assert u.substr(1, 2) == 'р' assert s2.ustring().at(1) == 'r' assert u.at(1) == 'р' first := u.at(0) last := u.at(u.len - 1) assert first.len == 2 assert last.len == 2 } fn test_lower() { mut s := 'A' assert s.to_lower() == 'a' assert s.to_lower().len == 1 s = 'HELLO' assert s.to_lower() == 'hello' assert s.to_lower().len == 5 s = 'Aloha' assert s.to_lower() == 'aloha' s = 'Have A nice Day!' assert s.to_lower() == 'have a nice day!' s = 'hi' assert s.to_lower() == 'hi' } fn test_upper() { mut s := 'a' assert s.to_upper() == 'A' assert s.to_upper().len == 1 s = 'hello' assert s.to_upper() == 'HELLO' assert s.to_upper().len == 5 s = 'Aloha' assert s.to_upper() == 'ALOHA' s = 'have a nice day!' assert s.to_upper() == 'HAVE A NICE DAY!' s = 'hi' assert s.to_upper() == 'HI' } fn test_left_right() { s := 'ALOHA' assert s.left(3) == 'ALO' assert s[3..] == 'HA' u := s.ustring() assert u.left(3) == 'ALO' assert u.right(3) == 'HA' } fn test_contains() { s := 'view.v' assert s.contains('vi') assert !s.contains('random') } fn test_arr_contains() { a := ['a', 'b', 'c'] assert a.contains('b') ints := [1, 2, 3] assert ints.contains(2) } fn test_to_num() { s := '7' assert s.int() == 7 assert s.u64() == 7 f := '71.5 hasdf' assert f.f32() == 71.5 b := 1.52345 mut a := '${b:.03f}' assert a == '1.523' num := 7 a = '${num:03d}' vals := ['9'] assert vals[0].int() == 9 big := '93993993939322' assert big.u64() == 93993993939322 assert big.i64() == 93993993939322 } fn test_hash() { s := '10000' assert s.hash() == 46730161 s2 := '24640' assert s2.hash() == 47778736 s3 := 'Content-Type' assert s3.hash() == 949037134 s4 := 'bad_key' assert s4.hash() == -346636507 s5 := '24640' // From a map collision test assert s5.hash() % ((1 << 20) -1) == s.hash() % ((1 << 20) -1) assert s5.hash() % ((1 << 20) -1) == 592861 } fn test_trim() { assert 'banana'.trim('bna') == '' assert 'abc'.trim('ac') == 'b' assert 'aaabccc'.trim('ac') == 'b' } fn test_trim_left() { mut s := 'module main' assert s.trim_left(' ') == 'module main' s = ' module main' assert s.trim_left(' ') == 'module main' // test cutset s = 'banana' assert s.trim_left('ba') == 'nana' } fn test_trim_right() { mut s := 'module main' assert s.trim_right(' ') == 'module main' s = 'module main ' assert s.trim_right(' ') == 'module main' // test cutset s = 'banana' assert s.trim_right('na') == 'b' } fn test_all_after() { s := 'fn hello' q := s.all_after('fn ') assert q == 'hello' } fn test_reverse() { s := 'hello' assert s.reverse() == 'olleh' t := '' assert t.reverse() == t } struct Foo { bar int } fn (f Foo) baz() string { return 'baz' } fn test_interpolation() { num := 7 mut s := 'number=$num' assert s == 'number=7' foo := Foo{} s = 'baz=${foo.baz()}' assert s == 'baz=baz' } fn test_bytes_to_string() { mut buf := calloc(10) buf[0] = `h` buf[1] = `e` buf[2] = `l` buf[3] = `l` buf[4] = `o` assert string(buf) == 'hello' assert string(buf, 2) == 'he' bytes := [`h`, `e`, `l`, `l`, `o`] assert string(bytes, 5) == 'hello' } fn test_count() { assert ''.count('') == 0 assert ''.count('a') == 0 assert 'a'.count('') == 0 assert 'aa'.count('a') == 2 assert 'aa'.count('aa') == 1 assert 'aabbaa'.count('aa') == 2 assert 'bbaabb'.count('aa') == 1 } fn test_capitalize() { mut s := 'hello' assert s.capitalize() == 'Hello' s = 'test' assert s.capitalize() == 'Test' s = 'i am ray' assert s.capitalize() == 'I am ray' } fn test_title() { s := 'hello world' assert s.title() == 'Hello World' s.to_upper() assert s.title() == 'Hello World' s.to_lower() assert s.title() == 'Hello World' } fn test_for_loop() { mut i := 0 s := 'abcd' for c in s { assert c == s[i] i++ } } fn test_for_loop_two() { s := 'abcd' for i, c in s { assert c == s[i] } } fn test_quote() { a := `'` println("testing double quotes") b := "hi" assert b == 'hi' assert a.str() == '\'' } fn test_ustring_comparisons() { assert ('h€llô !'.ustring() == 'h€llô !'.ustring()) == true assert ('h€llô !'.ustring() == 'h€llô'.ustring()) == false assert ('h€llô !'.ustring() == 'h€llo !'.ustring()) == false assert ('h€llô !'.ustring() != 'h€llô !'.ustring()) == false assert ('h€llô !'.ustring() != 'h€llô'.ustring()) == true assert ('h€llô'.ustring() < 'h€llô!'.ustring()) == true assert ('h€llô'.ustring() < 'h€llo'.ustring()) == false assert ('h€llo'.ustring() < 'h€llô'.ustring()) == true assert ('h€llô'.ustring() <= 'h€llô!'.ustring()) == true assert ('h€llô'.ustring() <= 'h€llô'.ustring()) == true assert ('h€llô!'.ustring() <= 'h€llô'.ustring()) == false assert ('h€llô!'.ustring() > 'h€llô'.ustring()) == true assert ('h€llô'.ustring() > 'h€llô'.ustring()) == false assert ('h€llô!'.ustring() >= 'h€llô'.ustring()) == true assert ('h€llô'.ustring() >= 'h€llô'.ustring()) == true assert ('h€llô'.ustring() >= 'h€llô!'.ustring()) == false } fn test_ustring_count() { a := 'h€llôﷰ h€llô ﷰ'.ustring() assert (a.count('l'.ustring())) == 4 assert (a.count('€'.ustring())) == 2 assert (a.count('h€llô'.ustring())) == 2 assert (a.count('ﷰ'.ustring())) == 2 assert (a.count('a'.ustring())) == 0 } fn test_repeat() { s := 'V! ' assert s.repeat(5) == 'V! V! V! V! V! ' } fn test_raw() { raw := r'raw\nstring' lines := raw.split('\n') assert lines.len == 1 println('raw string: "$raw"') } fn test_escape() { // TODO //a := 10 //println("\"$a") } fn test_atoi() { assert '234232'.int() == 234232 assert '-9009'.int() == -9009 assert '0'.int() == 0 for n in -10000 .. 100000 { s := n.str() assert s.int() == n } } fn test_raw_inter() { world := 'world' println(world) s := r'hello\n$world' assert s == r'hello\n$world' assert s.contains('$') } fn test_c_r() { // This used to break because of r'' and c'' c := 42 println('$c') r := 50 println('$r') } fn test_inter_before_comp_if() { s := '123' // This used to break ('123 $....') $if linux { println(s) } } fn test_double_quote_inter() { a := 1 b := 2 println("${a} ${b}") assert "${a} ${b}" == "1 2" assert '${a} ${b}' == "1 2" }