diff --git a/tests/snippets/builtin_chr.py b/tests/snippets/builtin_chr.py new file mode 100644 index 000000000..1ad642a58 --- /dev/null +++ b/tests/snippets/builtin_chr.py @@ -0,0 +1,8 @@ +from testutils import assert_raises + +assert "a" == chr(97) +assert "é" == chr(233) +assert "🤡" == chr(129313) + +assert_raises(TypeError, lambda: chr(), "chr() takes exactly one argument (0 given)") +assert_raises(ValueError, lambda: chr(0x110005), "ValueError: chr() arg not in range(0x110000)") diff --git a/vm/src/builtins.rs b/vm/src/builtins.rs index a82914ad1..b99a38608 100644 --- a/vm/src/builtins.rs +++ b/vm/src/builtins.rs @@ -73,10 +73,10 @@ fn builtin_callable(obj: PyObjectRef, vm: &VirtualMachine) -> bool { vm.is_callable(&obj) } -fn builtin_chr(i: u32, _vm: &VirtualMachine) -> String { +fn builtin_chr(i: u32, vm: &VirtualMachine) -> PyResult { match char::from_u32(i) { - Some(value) => value.to_string(), - None => '_'.to_string(), + Some(value) => Ok(value.to_string()), + None => Err(vm.new_value_error("chr() arg not in range(0x110000)".to_string())), } }