Skip to content

Commit 49b5d37

Browse files
committed
Fix min test case by doing mroe validation
1 parent f8d47c6 commit 49b5d37

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

Lib/test/test_builtin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -927,8 +927,6 @@ def __getitem__(self, index):
927927
self.assertEqual(max(data, key=f),
928928
sorted(reversed(data), key=f)[-1])
929929

930-
# TODO: RUSTPYTHON
931-
@unittest.expectedFailure
932930
def test_min(self):
933931
self.assertEqual(min('123123'), '1')
934932
self.assertEqual(min(1, 2, 3), 1)

vm/src/builtins/make_module.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,23 +508,38 @@ mod decl {
508508
}
509509

510510
#[pyfunction]
511-
fn min(args: FuncArgs, vm: &VirtualMachine) -> PyResult {
512-
let candidates = match args.args.len().cmp(&1) {
513-
std::cmp::Ordering::Greater => args.args.clone(),
514-
std::cmp::Ordering::Equal => vm.extract_elements(&args.args[0])?,
511+
fn min(mut args: FuncArgs, vm: &VirtualMachine) -> PyResult {
512+
let (candidates, default_allowed) = match args.args.len().cmp(&1) {
513+
std::cmp::Ordering::Greater => (args.args.clone(), false),
514+
std::cmp::Ordering::Equal => (vm.extract_elements(&args.args[0])?, true),
515515
std::cmp::Ordering::Less => {
516516
// zero arguments means type error:
517517
return Err(vm.new_type_error("Expected 1 or more arguments".to_owned()));
518518
}
519519
};
520520

521+
let default = args.take_keyword("default");
522+
let mut key_func = args.take_keyword("key");
523+
524+
match args.check_kwargs_empty(vm) {
525+
Some(err) => return Err(err),
526+
None => {},
527+
}
528+
529+
if !default_allowed && default.is_some() {
530+
return Err(vm.new_type_error("Specifying default not allowed with more than 1 argument".to_owned()));
531+
}
532+
521533
if candidates.is_empty() {
522-
let default = args.get_optional_kwarg("default");
523534
return default
524535
.ok_or_else(|| vm.new_value_error("min() arg is an empty sequence".to_owned()));
525536
}
526537

527-
let key_func = args.get_optional_kwarg("key");
538+
if let Some(ref obj) = key_func {
539+
if vm.is_none(obj) {
540+
key_func = None
541+
}
542+
}
528543

529544
let mut candidates_iter = candidates.into_iter();
530545
let mut x = candidates_iter.next().unwrap();

vm/src/function.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,23 @@ impl FuncArgs {
196196
T::arity().end(),
197197
given_args,
198198
)))
199-
} else if let Some(k) = self.kwargs.keys().next() {
200-
Err(vm.new_type_error(format!("Unexpected keyword argument {}", k)))
201-
} else {
199+
} else {
200+
match self.check_kwargs_empty(vm) {
201+
Some(err) => return Err(err),
202+
None => {},
203+
}
202204
Ok(bound)
203205
}
204206
}
207+
208+
pub fn check_kwargs_empty(&self, vm: &VirtualMachine) -> Option<PyBaseExceptionRef> {
209+
if let Some(k) = self.kwargs.keys().next() {
210+
Some(vm.new_type_error(format!("Unexpected keyword argument {}", k)))
211+
} else {
212+
None
213+
}
214+
}
215+
205216
}
206217

207218
/// An error encountered while binding arguments to the parameters of a Python

0 commit comments

Comments
 (0)