pyo3/tests/test_slice.rs

57 lines
1.4 KiB
Rust
Raw Normal View History

2017-05-20 19:22:35 +00:00
#![feature(proc_macro, specialization)]
2017-04-28 02:38:02 +00:00
#![allow(dead_code, unused_variables)]
2017-05-20 19:22:35 +00:00
extern crate pyo3;
2017-04-28 02:38:02 +00:00
2017-05-13 05:43:17 +00:00
use pyo3::*;
2017-04-28 02:38:02 +00:00
#[test]
fn test_basics() {
let gil = Python::acquire_gil();
let py = gil.python();
let v = PySlice::new(py, 1, 10, 2);
2017-05-25 05:43:07 +00:00
let indices = v.indices(100).unwrap();
2017-04-28 02:38:02 +00:00
assert_eq!(1, indices.start);
assert_eq!(10, indices.stop);
assert_eq!(2, indices.step);
assert_eq!(5, indices.slicelength);
}
2017-05-20 19:22:35 +00:00
#[py::class]
struct Test {}
#[py::proto]
impl<'p> PyMappingProtocol<'p> for Test
{
fn __getitem__(&self, py: Python, idx: PyObject<'p>) -> PyResult<PyPtr<PyObjectMarker>> {
if let Ok(slice) = idx.cast_as::<PySlice>() {
let indices = slice.indices(1000)?;
2017-04-28 02:38:02 +00:00
if indices.start == 100 && indices.stop == 200 && indices.step == 1 {
return Ok("slice".to_object(py))
2017-04-28 02:38:02 +00:00
}
}
else if let Ok(idx) = idx.extract::<isize>() {
2017-04-28 02:38:02 +00:00
if idx == 1 {
return Ok("int".to_object(py))
2017-04-28 02:38:02 +00:00
}
}
Err(PyErr::new::<exc::ValueError, _>(py, "error"))
}
2017-05-20 19:22:35 +00:00
}
2017-04-28 02:38:02 +00:00
#[test]
fn test_cls_impl() {
let gil = Python::acquire_gil();
let py = gil.python();
let ob = py.with_token(|e| Test{});
2017-04-28 02:38:02 +00:00
let d = PyDict::new(py);
d.set_item("ob", ob).unwrap();
2017-04-28 02:38:02 +00:00
py.run("assert ob[1] == 'int'", None, Some(&d)).unwrap();
py.run("assert ob[100:200:1] == 'slice'", None, Some(&d)).unwrap();
}