1+ from __future__ import division
2+
3+ import math
4+
5+ import pytest
6+
7+ from variants import variants
8+ from ._division_data import DivisionData
9+
10+
11+ class DivisionVariants (object ):
12+ """Example class with variant forms on an instance method."""
13+
14+ def __init__ (self , x ):
15+ self .x = x
16+
17+ @variants
18+ def divide (self , y ):
19+ return self .x / y
20+
21+ @divide .variant ('round' )
22+ def divide (self , y ):
23+ return round (self .divide (y ))
24+
25+ @divide .variant ('floor' )
26+ def divide (self , y ):
27+ return math .floor (self .divide (y ))
28+
29+ @divide .variant ('ceil' )
30+ def divide (self , y ):
31+ return math .ceil (self .divide (y ))
32+
33+ @divide .variant ('mode' )
34+ def divide (self , y , mode = None ):
35+ funcs = {
36+ None : self .divide ,
37+ 'floor' : self .divide .floor ,
38+ 'ceil' : self .divide .ceil ,
39+ 'round' : self .divide .round
40+ }
41+
42+ return funcs [mode ](y )
43+
44+
45+ @pytest .mark .xfail
46+ @pytest .mark .parametrize ('x,y,expected' , DivisionData .DIV_VALS )
47+ def test_divide (x , y , expected ):
48+ dv = DivisionVariants (x )
49+ assert dv .divide (y ) == expected
50+
51+
52+
53+ @pytest .mark .xfail
54+ @pytest .mark .parametrize ('x,y,expected' , DivisionData .ROUND_VALS )
55+ def test_round (x , y , expected ):
56+ dv = DivisionVariants (x )
57+ assert dv .divide .round (y ) == expected
58+
59+
60+
61+
62+ @pytest .mark .xfail
63+ @pytest .mark .parametrize ('x,y,expected' , DivisionData .FLOOR_VALS )
64+ def test_floor (x , y , expected ):
65+ dv = DivisionVariants (x )
66+ assert dv .divide .floor (y ) == expected
67+
68+
69+
70+
71+ @pytest .mark .xfail
72+ @pytest .mark .parametrize ('x,y,expected' , DivisionData .CEIL_VALS )
73+ def test_floor (x , y , expected ):
74+ dv = DivisionVariants (x )
75+ assert dv .divide .floor (y ) == expected
76+
77+
78+
79+ @pytest .mark .xfail
80+ @pytest .mark .parametrize ('x,y,expected,mode' , DivisionData .MODE_VALS )
81+ def test_mode (x , y , expected , mode ):
82+ dv = DivisionVariants (x )
83+ assert dv .divide .mode (y , mode ) == expected
84+
85+
86+ @pytest .mark .xfail
87+ @pytest .mark .parametrize ('x,y,expected,mode' , DivisionData .MODE_VALS )
88+ def test_mode_change_x (x , y , expected , mode ):
89+ # Test that with mutable values it still works after x is changed
90+ dv = DivisionVariants (x )
91+ assert dv .divide .mode (y , mode ) == expected
92+
93+ dv .x = 0
94+ assert dv .divide .mode (y , mode ) == 0
0 commit comments