diff --git a/tests/snippets/bytes.py b/tests/snippets/bytes.py index 1a4b43dfb..85469b756 100644 --- a/tests/snippets/bytes.py +++ b/tests/snippets/bytes.py @@ -14,7 +14,28 @@ except TypeError: else: assert False -# +a = b"abcd" +b = b"ab" +c = b"abcd" + +# +# repr +assert repr(bytes([0, 1, 2])) == repr(b'\x00\x01\x02') +assert ( +repr(bytes([0, 1, 9, 10, 11, 13, 31, 32, 33, 89, 120, 255]) +== "b'\\x00\\x01\\t\\n\\x0b\\r\\x1f !Yx\\xff'") +) +assert repr(b"abcd") == "b'abcd'" + +#len +assert len(bytes("abcdé", "utf8")) == 6 + +# +assert a == b"abcd" +# assert a > b +# assert a >= b +# assert b < a +# assert b <= a assert b'foobar'.__eq__(2) == NotImplemented assert b'foobar'.__ne__(2) == NotImplemented diff --git a/vm/src/obj/objbyteinner.rs b/vm/src/obj/objbyteinner.rs index fd08e4b93..8d32aeabf 100644 --- a/vm/src/obj/objbyteinner.rs +++ b/vm/src/obj/objbyteinner.rs @@ -1,4 +1,3 @@ -use crate::obj::objtype::PyClassRef; use crate::pyobject::PyObjectRef; use crate::function::OptionalArg; @@ -93,4 +92,33 @@ impl PyByteInner { } } } + + pub fn repr(&self) -> PyResult { + let mut res = String::with_capacity(self.elements.len()); + for i in self.elements.iter() { + match i { + 0..=8 => res.push_str(&format!("\\x0{}", i)), + 9 => res.push_str("\\t"), + 10 => res.push_str("\\n"), + 13 => res.push_str("\\r"), + 32..=126 => res.push(*(i) as char), + _ => res.push_str(&format!("\\x{:x}", i)), + } + } + Ok(res) + } + + pub fn len(&self) -> usize { + self.elements.len() + } + + pub fn eq(&self, other: &PyByteInner, vm: &VirtualMachine) -> PyResult { + if self.elements == other.elements { + Ok(vm.new_bool(true)) + } else { + Ok(vm.new_bool(false)) + } + } } +// TODO +// fix b"é" not allowed should be bytes("é", "utf8")