From ba694775f5ea61c9b29e318bbe2e4d942adb39ad Mon Sep 17 00:00:00 2001 From: Grahame Bowland Date: Mon, 9 Jan 2012 20:49:17 +0800 Subject: [PATCH] add tests for io::readchars and io::readchar Additionally reformat so that 'make check' passes. --- src/libstd/io.rs | 17 +++++++++------ src/test/stdtest/io.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/libstd/io.rs b/src/libstd/io.rs index f424b8c3a5e..63f014005dd 100644 --- a/src/libstd/io.rs +++ b/src/libstd/io.rs @@ -130,26 +130,29 @@ obj new_reader(rdr: buf_reader) { val += next & 63 as uint; } // See str::char_at - val += (b0 << (w + 1u as u8) as uint) << (w - 1u) * 6u - w - 1u; + val += (b0 << (w + 1u as u8) as uint) + << (w - 1u) * 6u - w - 1u; chars += [ val as char ]; } ret (i, 0u); } let buf: [u8] = []; let chars: [char] = []; - let nbread = n; // might need more bytes, but reading n will never over-read + // might need more bytes, but reading n will never over-read + let nbread = n; while nbread > 0u { - let data = self.read_bytes(nbread); + let data = self.read_bytes(nbread); if vec::len(data) == 0u { - // eof - FIXME should we do something if we're split in a unicode char? + // eof - FIXME should we do something if + // we're split in a unicode char? break; } buf += data; let (offset, nbreq) = chars_from_buf(buf, chars); let ncreq = n - vec::len(chars); - // again we either know we need a certain number of bytes to complete a - // character, or we make sure we don't over-read by reading 1-byte per char - // needed + // again we either know we need a certain number of bytes + // to complete a character, or we make sure we don't + // over-read by reading 1-byte per char needed nbread = if ncreq > nbreq { ncreq } else { nbreq }; if nbread > 0u { buf = vec::slice(buf, offset, vec::len(buf)); diff --git a/src/test/stdtest/io.rs b/src/test/stdtest/io.rs index 7e481fabea0..23c18acef0d 100644 --- a/src/test/stdtest/io.rs +++ b/src/test/stdtest/io.rs @@ -23,6 +23,54 @@ fn test_simple() { assert (str::eq(frood, frood2)); } +#[test] +fn test_readchars_empty() { + let inp : io::reader = io::string_reader(""); + let res : [char] = inp.read_chars(128u); + assert(vec::len(res) == 0u); +} + +#[test] +fn test_readchars_wide() { + let wide_test = "生锈的汤匙切肉汤hello生锈的汤匙切肉汤"; + let ivals : [int] = [ + 29983, 38152, 30340, 27748, + 21273, 20999, 32905, 27748, + 104, 101, 108, 108, 111, + 29983, 38152, 30340, 27748, + 21273, 20999, 32905, 27748]; + fn check_read_ln(len : uint, s: str, ivals: [int]) { + let inp : io::reader = io::string_reader(s); + let res : [char] = inp.read_chars(len); + if (len <= vec::len(ivals)) { + assert(vec::len(res) == len); + } + assert(vec::slice(ivals, 0u, vec::len(res)) == + vec::map(res, {|x| x as int})); + } + let i = 0u; + while i < 8u { + check_read_ln(i, wide_test, ivals); + i += 1u; + } + // check a long read for good measure + check_read_ln(128u, wide_test, ivals); +} + +#[test] +fn test_readchar() { + let inp : io::reader = io::string_reader("生"); + let res : char = inp.read_char(); + assert(res as int == 29983); +} + +#[test] +fn test_readchar_empty() { + let inp : io::reader = io::string_reader(""); + let res : char = inp.read_char(); + assert(res as int == -1); +} + #[test] fn file_reader_not_exist() { alt io::file_reader("not a file") {