@@ -774,16 +774,19 @@ def check_chained_cmp_op(self, lhs, cmp1, mid, cmp2, rhs):
774
774
f = lambda * args , ** kwargs : np .random .randn ()
775
775
776
776
777
- ENGINES_PARSERS = list (product (_engines , expr ._parsers ))
778
-
779
777
#-------------------------------------
780
778
# typecasting rules consistency with python
781
779
# issue #12388
782
780
783
781
784
782
class TestTypeCasting (object ):
785
-
786
- def check_binop_typecasting (self , engine , parser , op , dt ):
783
+ @pytest .mark .parametrize ('engine' , _engines )
784
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
785
+ @pytest .mark .parametrize ('op' , ['+' , '-' , '*' , '**' , '/' ])
786
+ # maybe someday... numexpr has too many upcasting rules now
787
+ # chain(*(np.sctypes[x] for x in ['uint', 'int', 'float']))
788
+ @pytest .mark .parametrize ('dt' , [np .float32 , np .float64 ])
789
+ def test_binop_typecasting (self , engine , parser , op , dt ):
787
790
tm .skip_if_no_ne (engine )
788
791
df = mkdf (5 , 3 , data_gen_f = f , dtype = dt )
789
792
s = 'df {} 3' .format (op )
@@ -798,15 +801,6 @@ def check_binop_typecasting(self, engine, parser, op, dt):
798
801
assert res .values .dtype == dt
799
802
assert_frame_equal (res , eval (s ))
800
803
801
- def test_binop_typecasting (self ):
802
- for engine , parser in ENGINES_PARSERS :
803
- for op in ['+' , '-' , '*' , '**' , '/' ]:
804
- # maybe someday... numexpr has too many upcasting rules now
805
- # for dt in chain(*(np.sctypes[x] for x in ['uint', 'int',
806
- # 'float'])):
807
- for dt in [np .float32 , np .float64 ]:
808
- yield self .check_binop_typecasting , engine , parser , op , dt
809
-
810
804
811
805
#-------------------------------------
812
806
# basic and complex alignment
@@ -826,18 +820,18 @@ class TestAlignment(object):
826
820
index_types = 'i' , 'u' , 'dt'
827
821
lhs_index_types = index_types + ('s' ,) # 'p'
828
822
829
- def check_align_nested_unary_op (self , engine , parser ):
823
+ @pytest .mark .parametrize ('engine' , _engines )
824
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
825
+ def test_align_nested_unary_op (self , engine , parser ):
830
826
tm .skip_if_no_ne (engine )
831
827
s = 'df * ~2'
832
828
df = mkdf (5 , 3 , data_gen_f = f )
833
829
res = pd .eval (s , engine = engine , parser = parser )
834
830
assert_frame_equal (res , df * ~ 2 )
835
831
836
- def test_align_nested_unary_op (self ):
837
- for engine , parser in ENGINES_PARSERS :
838
- yield self .check_align_nested_unary_op , engine , parser
839
-
840
- def check_basic_frame_alignment (self , engine , parser ):
832
+ @pytest .mark .parametrize ('engine' , _engines )
833
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
834
+ def test_basic_frame_alignment (self , engine , parser ):
841
835
tm .skip_if_no_ne (engine )
842
836
args = product (self .lhs_index_types , self .index_types ,
843
837
self .index_types )
@@ -856,11 +850,9 @@ def check_basic_frame_alignment(self, engine, parser):
856
850
res = pd .eval ('df + df2' , engine = engine , parser = parser )
857
851
assert_frame_equal (res , df + df2 )
858
852
859
- def test_basic_frame_alignment (self ):
860
- for engine , parser in ENGINES_PARSERS :
861
- yield self .check_basic_frame_alignment , engine , parser
862
-
863
- def check_frame_comparison (self , engine , parser ):
853
+ @pytest .mark .parametrize ('engine' , _engines )
854
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
855
+ def test_frame_comparison (self , engine , parser ):
864
856
tm .skip_if_no_ne (engine )
865
857
args = product (self .lhs_index_types , repeat = 2 )
866
858
for r_idx_type , c_idx_type in args :
@@ -874,11 +866,10 @@ def check_frame_comparison(self, engine, parser):
874
866
res = pd .eval ('df < df3' , engine = engine , parser = parser )
875
867
assert_frame_equal (res , df < df3 )
876
868
877
- def test_frame_comparison (self ):
878
- for engine , parser in ENGINES_PARSERS :
879
- yield self .check_frame_comparison , engine , parser
880
-
881
- def check_medium_complex_frame_alignment (self , engine , parser ):
869
+ @slow
870
+ @pytest .mark .parametrize ('engine' , _engines )
871
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
872
+ def test_medium_complex_frame_alignment (self , engine , parser ):
882
873
tm .skip_if_no_ne (engine )
883
874
args = product (self .lhs_index_types , self .index_types ,
884
875
self .index_types , self .index_types )
@@ -899,12 +890,9 @@ def check_medium_complex_frame_alignment(self, engine, parser):
899
890
engine = engine , parser = parser )
900
891
assert_frame_equal (res , df + df2 + df3 )
901
892
902
- @slow
903
- def test_medium_complex_frame_alignment (self ):
904
- for engine , parser in ENGINES_PARSERS :
905
- yield self .check_medium_complex_frame_alignment , engine , parser
906
-
907
- def check_basic_frame_series_alignment (self , engine , parser ):
893
+ @pytest .mark .parametrize ('engine' , _engines )
894
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
895
+ def test_basic_frame_series_alignment (self , engine , parser ):
908
896
tm .skip_if_no_ne (engine )
909
897
910
898
def testit (r_idx_type , c_idx_type , index_name ):
@@ -932,11 +920,9 @@ def testit(r_idx_type, c_idx_type, index_name):
932
920
for r_idx_type , c_idx_type , index_name in args :
933
921
testit (r_idx_type , c_idx_type , index_name )
934
922
935
- def test_basic_frame_series_alignment (self ):
936
- for engine , parser in ENGINES_PARSERS :
937
- yield self .check_basic_frame_series_alignment , engine , parser
938
-
939
- def check_basic_series_frame_alignment (self , engine , parser ):
923
+ @pytest .mark .parametrize ('engine' , _engines )
924
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
925
+ def test_basic_series_frame_alignment (self , engine , parser ):
940
926
tm .skip_if_no_ne (engine )
941
927
942
928
def testit (r_idx_type , c_idx_type , index_name ):
@@ -968,11 +954,9 @@ def testit(r_idx_type, c_idx_type, index_name):
968
954
for r_idx_type , c_idx_type , index_name in args :
969
955
testit (r_idx_type , c_idx_type , index_name )
970
956
971
- def test_basic_series_frame_alignment (self ):
972
- for engine , parser in ENGINES_PARSERS :
973
- yield self .check_basic_series_frame_alignment , engine , parser
974
-
975
- def check_series_frame_commutativity (self , engine , parser ):
957
+ @pytest .mark .parametrize ('engine' , _engines )
958
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
959
+ def test_series_frame_commutativity (self , engine , parser ):
976
960
tm .skip_if_no_ne (engine )
977
961
args = product (self .lhs_index_types , self .index_types , ('+' , '*' ),
978
962
('index' , 'columns' ))
@@ -1000,11 +984,10 @@ def check_series_frame_commutativity(self, engine, parser):
1000
984
if engine == 'numexpr' :
1001
985
assert_frame_equal (a , b )
1002
986
1003
- def test_series_frame_commutativity (self ):
1004
- for engine , parser in ENGINES_PARSERS :
1005
- yield self .check_series_frame_commutativity , engine , parser
1006
-
1007
- def check_complex_series_frame_alignment (self , engine , parser ):
987
+ @slow
988
+ @pytest .mark .parametrize ('engine' , _engines )
989
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
990
+ def test_complex_series_frame_alignment (self , engine , parser ):
1008
991
tm .skip_if_no_ne (engine )
1009
992
1010
993
import random
@@ -1050,12 +1033,9 @@ def check_complex_series_frame_alignment(self, engine, parser):
1050
1033
tm .assert_equal (res .shape , expected .shape )
1051
1034
assert_frame_equal (res , expected )
1052
1035
1053
- @slow
1054
- def test_complex_series_frame_alignment (self ):
1055
- for engine , parser in ENGINES_PARSERS :
1056
- yield self .check_complex_series_frame_alignment , engine , parser
1057
-
1058
- def check_performance_warning_for_poor_alignment (self , engine , parser ):
1036
+ @pytest .mark .parametrize ('engine' , _engines )
1037
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1038
+ def test_performance_warning_for_poor_alignment (self , engine , parser ):
1059
1039
tm .skip_if_no_ne (engine )
1060
1040
df = DataFrame (randn (1000 , 10 ))
1061
1041
s = Series (randn (10000 ))
@@ -1098,11 +1078,6 @@ def check_performance_warning_for_poor_alignment(self, engine, parser):
1098
1078
"" .format (1 , 'df' , np .log10 (s .size - df .shape [1 ])))
1099
1079
tm .assert_equal (msg , expected )
1100
1080
1101
- def test_performance_warning_for_poor_alignment (self ):
1102
- for engine , parser in ENGINES_PARSERS :
1103
- yield (self .check_performance_warning_for_poor_alignment , engine ,
1104
- parser )
1105
-
1106
1081
1107
1082
#------------------------------------
1108
1083
# slightly more complex ops
@@ -1832,31 +1807,27 @@ def test_disallowed_nodes():
1832
1807
yield check_disallowed_nodes , engine , visitor
1833
1808
1834
1809
1835
- def check_syntax_error_exprs (engine , parser ):
1810
+ @pytest .mark .parametrize ('engine' , _engines )
1811
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1812
+ def test_syntax_error_exprs (engine , parser ):
1836
1813
tm .skip_if_no_ne (engine )
1837
1814
e = 's +'
1838
1815
with pytest .raises (SyntaxError ):
1839
1816
pd .eval (e , engine = engine , parser = parser )
1840
1817
1841
1818
1842
- def test_syntax_error_exprs ():
1843
- for engine , parser in ENGINES_PARSERS :
1844
- yield check_syntax_error_exprs , engine , parser
1845
-
1846
-
1847
- def check_name_error_exprs (engine , parser ):
1819
+ @pytest .mark .parametrize ('engine' , _engines )
1820
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1821
+ def test_name_error_exprs (engine , parser ):
1848
1822
tm .skip_if_no_ne (engine )
1849
1823
e = 's + t'
1850
1824
with tm .assertRaises (NameError ):
1851
1825
pd .eval (e , engine = engine , parser = parser )
1852
1826
1853
1827
1854
- def test_name_error_exprs ():
1855
- for engine , parser in ENGINES_PARSERS :
1856
- yield check_name_error_exprs , engine , parser
1857
-
1858
-
1859
- def check_invalid_local_variable_reference (engine , parser ):
1828
+ @pytest .mark .parametrize ('engine' , _engines )
1829
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1830
+ def test_invalid_local_variable_reference (engine , parser ):
1860
1831
tm .skip_if_no_ne (engine )
1861
1832
1862
1833
a , b = 1 , 2
@@ -1870,12 +1841,9 @@ def check_invalid_local_variable_reference(engine, parser):
1870
1841
pd .eval (exprs , engine = engine , parser = parser )
1871
1842
1872
1843
1873
- def test_invalid_local_variable_reference ():
1874
- for engine , parser in ENGINES_PARSERS :
1875
- yield check_invalid_local_variable_reference , engine , parser
1876
-
1877
-
1878
- def check_numexpr_builtin_raises (engine , parser ):
1844
+ @pytest .mark .parametrize ('engine' , _engines )
1845
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1846
+ def test_numexpr_builtin_raises (engine , parser ):
1879
1847
tm .skip_if_no_ne (engine )
1880
1848
sin , dotted_line = 1 , 2
1881
1849
if engine == 'numexpr' :
@@ -1887,48 +1855,34 @@ def check_numexpr_builtin_raises(engine, parser):
1887
1855
tm .assert_equal (res , sin + dotted_line )
1888
1856
1889
1857
1890
- def test_numexpr_builtin_raises ():
1891
- for engine , parser in ENGINES_PARSERS :
1892
- yield check_numexpr_builtin_raises , engine , parser
1893
-
1894
-
1895
- def check_bad_resolver_raises (engine , parser ):
1858
+ @pytest .mark .parametrize ('engine' , _engines )
1859
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1860
+ def test_bad_resolver_raises (engine , parser ):
1896
1861
tm .skip_if_no_ne (engine )
1897
1862
cannot_resolve = 42 , 3.0
1898
1863
with tm .assertRaisesRegexp (TypeError , 'Resolver of type .+' ):
1899
1864
pd .eval ('1 + 2' , resolvers = cannot_resolve , engine = engine ,
1900
1865
parser = parser )
1901
1866
1902
1867
1903
- def test_bad_resolver_raises ():
1904
- for engine , parser in ENGINES_PARSERS :
1905
- yield check_bad_resolver_raises , engine , parser
1906
-
1907
-
1908
- def check_empty_string_raises (engine , parser ):
1868
+ @pytest .mark .parametrize ('engine' , _engines )
1869
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1870
+ def test_empty_string_raises (engine , parser ):
1909
1871
# GH 13139
1910
1872
tm .skip_if_no_ne (engine )
1911
1873
with tm .assertRaisesRegexp (ValueError , 'expr cannot be an empty string' ):
1912
1874
pd .eval ('' , engine = engine , parser = parser )
1913
1875
1914
1876
1915
- def test_empty_string_raises ():
1916
- for engine , parser in ENGINES_PARSERS :
1917
- yield check_empty_string_raises , engine , parser
1918
-
1919
-
1920
- def check_more_than_one_expression_raises (engine , parser ):
1877
+ @pytest .mark .parametrize ('engine' , _engines )
1878
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1879
+ def test_more_than_one_expression_raises (engine , parser ):
1921
1880
tm .skip_if_no_ne (engine )
1922
1881
with tm .assertRaisesRegexp (SyntaxError ,
1923
1882
'only a single expression is allowed' ):
1924
1883
pd .eval ('1 + 1; 2 + 2' , engine = engine , parser = parser )
1925
1884
1926
1885
1927
- def test_more_than_one_expression_raises ():
1928
- for engine , parser in ENGINES_PARSERS :
1929
- yield check_more_than_one_expression_raises , engine , parser
1930
-
1931
-
1932
1886
def check_bool_ops_fails_on_scalars (gen , lhs , cmp , rhs , engine , parser ):
1933
1887
tm .skip_if_no_ne (engine )
1934
1888
mid = gen [type (lhs )]()
@@ -1951,19 +1905,16 @@ def test_bool_ops_fails_on_scalars():
1951
1905
gen [dtype2 ](), engine , parser )
1952
1906
1953
1907
1954
- def check_inf (engine , parser ):
1908
+ @pytest .mark .parametrize ('engine' , _engines )
1909
+ @pytest .mark .parametrize ('parser' , expr ._parsers )
1910
+ def test_inf (engine , parser ):
1955
1911
tm .skip_if_no_ne (engine )
1956
1912
s = 'inf + 1'
1957
1913
expected = np .inf
1958
1914
result = pd .eval (s , engine = engine , parser = parser )
1959
1915
tm .assert_equal (result , expected )
1960
1916
1961
1917
1962
- def test_inf ():
1963
- for engine , parser in ENGINES_PARSERS :
1964
- yield check_inf , engine , parser
1965
-
1966
-
1967
1918
def check_negate_lt_eq_le (engine , parser ):
1968
1919
tm .skip_if_no_ne (engine )
1969
1920
df = pd .DataFrame ([[0 , 10 ], [1 , 20 ]], columns = ['cat' , 'count' ])
0 commit comments