From 487013578a10c5745da5887b6363030ac4d8cef2 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 6 Feb 2017 16:52:00 -0700 Subject: [PATCH 01/10] MNT: Always run coverage on AppVeyor --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 7d00b1c51f89..bed7d44a0df6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -140,8 +140,8 @@ test_script: - if x%USE_PYTEST% == xno python tests.py %PYTEST_ARGS% # Generate a html for visual tests - python visual_tests.py - - if x%USE_PYTEST% == xyes pip install codecov - - if x%USE_PYTEST% == xyes codecov -e PYTHON_VERSION PLATFORM + - pip install codecov + - codecov -e PYTHON_VERSION PLATFORM after_test: # After the tests were a success, build packages (wheels and conda) From 2519bf230bfebe17eddb953d0a2c462c0da5ebbd Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 6 Feb 2017 16:52:48 -0700 Subject: [PATCH 02/10] MNT: Increase required test lines coverage Trying to ensure we don't backslide. --- ci/codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/codecov.yml b/ci/codecov.yml index 500b4a9f0d63..842794a555c6 100644 --- a/ci/codecov.yml +++ b/ci/codecov.yml @@ -24,5 +24,5 @@ coverage: paths: '!lib/.*/tests/.*' tests: - target: 97.7% + target: 97.9% paths: 'lib/.*/tests/.*' From d8907b7e7e9b497ee411f4b0e1b0c045dd080c32 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 6 Feb 2017 17:42:57 -0700 Subject: [PATCH 03/10] BUG: Fix duplicated test name in test_axes. This was causing the first test to not run. --- lib/matplotlib/tests/test_axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 19cc9267b794..54c77e69b1c9 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -866,7 +866,7 @@ def test_symlog2(): ax.set_ylim(-0.1, 0.1) -def test_pcolorargs(): +def test_pcolorargs_5205(): # Smoketest to catch issue found in gh:5205 x = [-1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5] y = [-1.5, -1.25, -1.0, -0.75, -0.5, -0.25, 0, From 093923bae35f415a148ebfe4f9551a3c70db8389 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 6 Feb 2017 17:54:46 -0700 Subject: [PATCH 04/10] BUG: Fix duplicated test name in test_contour.py Regenerate test images now that this test is actually run. --- .../test_contour/contour_manual_labels.pdf | Bin 7422 -> 7316 bytes .../test_contour/contour_manual_labels.png | Bin 13112 -> 13176 bytes .../test_contour/contour_manual_labels.svg | 178 +++++++++--------- lib/matplotlib/tests/test_contour.py | 2 +- 4 files changed, 90 insertions(+), 90 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.pdf b/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.pdf index 6404ae457352849ed2a275e888e411e9c54f9d9f..2dd02c48fb5a909a6b6664ef0e6818b5439bfd68 100644 GIT binary patch delta 2309 zcma)7dsGu=7B^CwCcKLB2KA#t2r4F-nY@rkLBhi#2oVGo>kx(zArnXf0kNjaX|c84 zvvfePh}hCyZAndO>`H>W2nt#id+3XL5W2N1+AWbsD1uscXM%1m^pBmHb7sEZz4yDn z@7_7TJ14Fc|2ZIW3o6Gn00LZ)4mevYiZQ_1h-%Ryl^jGxF)=((mAi*2BF)r0A_8zE z<=O{|8>`d8X08;3X92 zSmWFz>FloVqJ)|d>~j2xl3?xhQ6CUj_RhHFC_m4G~Y6ogIA7kBVsW!$N9bP&p zjjcTHu^}{UIz2bz#nEq)gQs6h^j!|pYzgEOGux7FOPH9{`4>wKU-nw_5qy(#!!uvk zhPewRp1p5Q;>?4%Kyvkp9lHaz4&~|Hq`&OUG8b9FCm1x!Z%@66oVHWIA{F(>dEnv50Xf^TnOl z??{Mm9RjR9bDs5;6%)g+O7C?ZK2et>y%w67l{VAa>1CWMGMG0O zjZr!}rc}#hw$k>B-`6=SZFK9$Hu>AFXWNwf zr>iWDuRqGJ|9QwZiL5h@T))&lyvCbFj}Vg0plqc<*XI}X+ok#W}R%F|z5v6!su^y9v+=C%yyk{cUu zwr8g_IsLk|!=yAE3)h65)TUn^4a9Z0=Dp@Kd;QL~?H4&)&keNCW17)l5d3BA;ayAR zl-hRp#&Cb?_u*3Ghb33L9Z-WrGIH!{6iatsFz7SrRCv=ka;f>o(LF=0=eD;uFRAYR z_M=vQ>&d3SZp)}QKfLf0V~6wleJv$d$60sT&o@ksXR3!vHWmJQZN^I|G`E|-+0rBP zj;z?*zae^1bf6)_z&QWmsF`6nEw6H1x$}qkAA2Xd()a^2w{j2kL=T-;iHT�Gg0c zI6|gFZl`F(oMWho?&3`&s_CJ`CZ`I*g|WuOe)eS=af%sAWV@?~K&McmpP5EnbYc^Y zjxu7{In?wCJ%>iDbPY8L7#bR}+l_5XaP_4TJa;xR>NH7Qc6VXLq8iMuTbwv-51Lsj zMR5(OO9iNUi&`bq03M%GCZc26E0TDHTBD^bB*LL$V&_FFjK_s|APf<}fF~3qfCs@a zrB;+n9Hx<}6~$VW8t`EIPK;$NeKPuZBZ$ujoD@_^YVB|7nH*_puGTKVlnld9)Oeoe zHbtJcfaEnV)W0dSefuZU9HWs@LMevCl!zB6VhVYImZDAZ!Stjl41xtD#UfO$0Wie; zf6ud!E8rxNBSImI!R195;F98vmfIPU$3-B(k!mqzCY5-8pv;$K`TuId$$CP~B}N=ecvHU{o?Y)w;+tq6D>-Ki2nc+@W>NV*Hd&McoD`!_=|Gz#8efzT>aC* z5QHpB3?bY_XMlv_MH@n5glymM$-rCz*~JAI#C;l**v&9s{4{9C$hwnl|9vn5!;1(C V1bjYW43IDdLLoCaSdtpg{4b;PMC||o delta 2426 zcmaJ?dsGv57B;9Y1bHm7SlCd0$`T2$$;{+Il!Zg&A((;!MMSYq$PfbLVKO{?K-xvc z7bp%73sR~az$K*~Nwq4Eu58yWD%L73vX**~c0mx+xz>Q7()y03FQ=l*q69os+{dm}>(I4Hn@)S5 zj#~3ijO{R5d+ct$Nt~_EKufNb^h0h$do5cqntZvw^Gv{|DERAyGgg)DxoK_APEQdV z;(f{Fsby1kos&1L21PF(M}i0Xo7lU>p_+%;tBDKo*;g+)>JHSH3M!w~zbF>}5)oQZ z$0?|D{A^2E#yO|=6uSdV0R5+s?f8ce}*g z(am>1&s{P$Sl@BJwXoym@Q1M;ZzioT#x!)Iub=gOz=30vZ+=}A6!i(OQRO=#W^=L&OIb^c7BvbUJb%8Z|C zI#=wpC-+%A&(P6({;TSf$-@$PR(sMnPLI%&(IJY$o9LU}o zdoQL>y3Td zoli%uJP_8pWL73rt@3V*#k;(atx3L3bor5+-RNMIb+KqoqzY7JhFmgYec?LP^$RU4ks}6-}Yx&iEXhR9Zb*Wl~hEQt(j9Ppq22)ZlCRPwS zLW^U{L|lu-V=A40oLY&g$Z03GUX1B*vm5;{6cgI2kP+!R09)J-iqDo3W^<%15~Vyc z9n)^ss#7Th-%{1$ofg&zg;qz<5Wr=cZBHy#=Yj3O9}eUJf5Z+IP{e_OK!k`u3Mq2R z*GsUu1cc9j#cRzY{W>l^D(#s52$la|Xy>s4D4xKTiBxY;L>4C30Tf|ENgHv6Je>f1 zo)AF4H5`VM9?r~Uy7&L99TR#B%QFi@Y0X3EO`(}%6rxn2C~9vgQbSepES#FS}hfz0y4=Zmwp=Wxs)^XIy?tg0eEgb=oEPXrk6_`fQWQ0jsw`d0|2DKwFN83Zr+Lci1|F3-h@!B7}Kdge&mp^44;> zYdK7ax(KrDR9p+Zl^CJPQWIGUDbUE$fD}v3q_!pnF;h`@^i>2Lzz>k&Ij|o{CkV|t z2>LBMK&_QCI3&|8TrZ?%qkljJnC3rR0Vi(-6A%=tJj zS3uos>POyjv$GPSWWSr29u-n@&d2d#{-R!ZA|9pmd>oI@Upxl_FRBZpqD3`eK5CBX zUljosA=Ej~FM^=-*)NC*kwpz6fxJb+pxnjHpvb&t!p+pEfcBvIMNkoHQR|gc;_;|< Y7vKZ}6d}V|;Y?v5%JlLIkBwmd2NK_56#xJL diff --git a/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.png b/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.png index 86d29d3c4cd898e3a44d058307bdcf36dc0c665a..0884343cd928a51eff323309672a6c3c8b6176c8 100644 GIT binary patch literal 13176 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ù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 hx%ne*nX(EF1s; literal 13112 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 diff --git a/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.svg b/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.svg index b8f5be69bf98..6ce04555e1b3 100644 --- a/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.svg +++ b/lib/matplotlib/tests/baseline_images/test_contour/contour_manual_labels.svg @@ -27,17 +27,17 @@ z " style="fill:#ffffff;"/> - - - - - - - - +" id="m368fc901b1" style="stroke:#000000;stroke-width:0.5;"/> - + +" id="mc63e59a608" style="stroke:#000000;stroke-width:0.5;"/> - + @@ -159,7 +159,7 @@ Q 6.59375 54.828125 13.0625 64.515625 Q 19.53125 74.21875 31.78125 74.21875 " id="DejaVuSans-30"/> - + @@ -167,12 +167,12 @@ Q 19.53125 74.21875 31.78125 74.21875 - + - + @@ -192,7 +192,7 @@ L 12.40625 0 z " id="DejaVuSans-31"/> - + @@ -200,12 +200,12 @@ z - + - + @@ -235,7 +235,7 @@ Q 44.1875 33.984375 37.640625 27.21875 Q 31.109375 20.453125 19.1875 8.296875 " id="DejaVuSans-32"/> - + @@ -243,12 +243,12 @@ Q 31.109375 20.453125 19.1875 8.296875 - + - + @@ -286,7 +286,7 @@ Q 53.90625 49.265625 50.4375 45.09375 Q 46.96875 40.921875 40.578125 39.3125 " id="DejaVuSans-33"/> - + @@ -294,12 +294,12 @@ Q 46.96875 40.921875 40.578125 39.3125 - + - + @@ -323,7 +323,7 @@ L 4.890625 26.703125 z " id="DejaVuSans-34"/> - + @@ -331,12 +331,12 @@ z - + - + @@ -367,7 +367,7 @@ Q 14.890625 38.140625 10.796875 36.28125 z " id="DejaVuSans-35"/> - + @@ -375,12 +375,12 @@ z - + - + @@ -415,7 +415,7 @@ Q 40.921875 74.21875 44.703125 73.484375 Q 48.484375 72.75 52.59375 71.296875 " id="DejaVuSans-36"/> - + @@ -423,12 +423,12 @@ Q 48.484375 72.75 52.59375 71.296875 - + - + @@ -444,7 +444,7 @@ L 8.203125 64.59375 z " id="DejaVuSans-37"/> - + @@ -452,12 +452,12 @@ z - + - + @@ -500,7 +500,7 @@ Q 25.390625 66.40625 21.84375 63.234375 Q 18.3125 60.0625 18.3125 54.390625 " id="DejaVuSans-38"/> - + @@ -508,12 +508,12 @@ Q 18.3125 60.0625 18.3125 54.390625 - + - + @@ -548,7 +548,7 @@ Q 16.21875 41.5 20.09375 36.953125 Q 23.96875 32.421875 30.609375 32.421875 " id="DejaVuSans-39"/> - + @@ -560,25 +560,25 @@ Q 23.96875 32.421875 30.609375 32.421875 +" id="m556f96d829" style="stroke:#000000;stroke-width:0.5;"/> - + +" id="m27e32ca04a" style="stroke:#000000;stroke-width:0.5;"/> - + - + @@ -586,17 +586,17 @@ L -4 0 - + - + - + @@ -604,17 +604,17 @@ L -4 0 - + - + - + @@ -622,17 +622,17 @@ L -4 0 - + - + - + @@ -640,17 +640,17 @@ L -4 0 - + - + - + @@ -658,17 +658,17 @@ L -4 0 - + - + - + @@ -676,17 +676,17 @@ L -4 0 - + - + - + @@ -694,17 +694,17 @@ L -4 0 - + - + - + @@ -712,17 +712,17 @@ L -4 0 - + - + - + @@ -730,24 +730,24 @@ L -4 0 - + - + - + - + - + - - - + + + - + - + - - - + + + - + - + - - - + + + @@ -793,8 +793,8 @@ z - - + + diff --git a/lib/matplotlib/tests/test_contour.py b/lib/matplotlib/tests/test_contour.py index dd17358edeb7..e455bd4c07b8 100644 --- a/lib/matplotlib/tests/test_contour.py +++ b/lib/matplotlib/tests/test_contour.py @@ -158,7 +158,7 @@ def test_contour_manual_labels(): @image_comparison(baseline_images=['contour_labels_size_color'], extensions=['png'], remove_text=True) -def test_contour_manual_labels(): +def test_contour_labels_size_color(): x, y = np.meshgrid(np.arange(0, 10), np.arange(0, 10)) z = np.max(np.dstack([abs(x), abs(y)]), 2) From ae2381c3ff081f0612e0457ef3b9edf743d57df5 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 11:01:42 -0700 Subject: [PATCH 05/10] MNT: Remove duplicated test code. This was an exact duplicate of the code above it. --- lib/matplotlib/tests/test_mlab.py | 67 ------------------------------- 1 file changed, 67 deletions(-) diff --git a/lib/matplotlib/tests/test_mlab.py b/lib/matplotlib/tests/test_mlab.py index 565df780e86a..9f77df82e472 100644 --- a/lib/matplotlib/tests/test_mlab.py +++ b/lib/matplotlib/tests/test_mlab.py @@ -955,73 +955,6 @@ def test_detrend_mean_2D_axism1(self): assert_allclose(res, targ, atol=1e-08) - def test_detrend_mean_2D_none(self): - arri = [self.sig_off, - self.sig_base + self.sig_off] - arrt = [self.sig_zeros, - self.sig_base] - input = np.vstack(arri) - targ = np.vstack(arrt) - res = mlab.detrend_mean(input, axis=None) - assert_allclose(res, targ, - atol=1e-08) - - def test_detrend_mean_2D_none_T(self): - arri = [self.sig_off, - self.sig_base + self.sig_off] - arrt = [self.sig_zeros, - self.sig_base] - input = np.vstack(arri).T - targ = np.vstack(arrt) - res = mlab.detrend_mean(input, axis=None) - assert_allclose(res.T, targ, - atol=1e-08) - - def test_detrend_mean_2D_axis0(self): - arri = [self.sig_base, - self.sig_base + self.sig_off, - self.sig_base + self.sig_slope, - self.sig_base + self.sig_off + self.sig_slope] - arrt = [self.sig_base, - self.sig_base, - self.sig_base + self.sig_slope_mean, - self.sig_base + self.sig_slope_mean] - input = np.vstack(arri).T - targ = np.vstack(arrt).T - res = mlab.detrend_mean(input, axis=0) - assert_allclose(res, targ, - atol=1e-08) - - def test_detrend_mean_2D_axis1(self): - arri = [self.sig_base, - self.sig_base + self.sig_off, - self.sig_base + self.sig_slope, - self.sig_base + self.sig_off + self.sig_slope] - arrt = [self.sig_base, - self.sig_base, - self.sig_base + self.sig_slope_mean, - self.sig_base + self.sig_slope_mean] - input = np.vstack(arri) - targ = np.vstack(arrt) - res = mlab.detrend_mean(input, axis=1) - assert_allclose(res, targ, - atol=1e-08) - - def test_detrend_mean_2D_axism1(self): - arri = [self.sig_base, - self.sig_base + self.sig_off, - self.sig_base + self.sig_slope, - self.sig_base + self.sig_off + self.sig_slope] - arrt = [self.sig_base, - self.sig_base, - self.sig_base + self.sig_slope_mean, - self.sig_base + self.sig_slope_mean] - input = np.vstack(arri) - targ = np.vstack(arrt) - res = mlab.detrend_mean(input, axis=-1) - assert_allclose(res, targ, - atol=1e-08) - def test_detrend_2D_default(self): arri = [self.sig_off, self.sig_base + self.sig_off] From 7d0a3d340edfa5ce771ba25970fcb6313bbe4341 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 11:06:01 -0700 Subject: [PATCH 06/10] MNT: Remove unused pickling debug code. This was deflating our coverage numbers for the tests. If deemed necessary, this code should be resurrected elsewhere (outside tests). Also cleaned up the code a bit. --- lib/matplotlib/tests/test_pickle.py | 97 ++--------------------------- 1 file changed, 5 insertions(+), 92 deletions(-) diff --git a/lib/matplotlib/tests/test_pickle.py b/lib/matplotlib/tests/test_pickle.py index 4f1ab2515c35..de3b30cb5966 100644 --- a/lib/matplotlib/tests/test_pickle.py +++ b/lib/matplotlib/tests/test_pickle.py @@ -1,7 +1,6 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) -import six from six.moves import cPickle as pickle from six.moves import range @@ -15,88 +14,8 @@ import matplotlib.transforms as mtransforms -def depth_getter(obj, - current_depth=0, - depth_stack=None, - nest_info='top level object'): - """ - Returns a dictionary mapping: - - id(obj): (shallowest_depth, obj, nest_info) - - for the given object (and its subordinates). - - This, in conjunction with recursive_pickle, can be used to debug - pickling issues, although finding others is sometimes a case of - trial and error. - - """ - if depth_stack is None: - depth_stack = {} - - if id(obj) in depth_stack: - stack = depth_stack[id(obj)] - if stack[0] > current_depth: - del depth_stack[id(obj)] - else: - return depth_stack - - depth_stack[id(obj)] = (current_depth, obj, nest_info) - - if isinstance(obj, (list, tuple)): - for i, item in enumerate(obj): - depth_getter(item, current_depth=current_depth + 1, - depth_stack=depth_stack, - nest_info=('list/tuple item #%s in ' - '(%s)' % (i, nest_info))) - else: - if isinstance(obj, dict): - state = obj - elif hasattr(obj, '__getstate__'): - state = obj.__getstate__() - if not isinstance(state, dict): - state = {} - elif hasattr(obj, '__dict__'): - state = obj.__dict__ - else: - state = {} - - for key, value in six.iteritems(state): - depth_getter(value, current_depth=current_depth + 1, - depth_stack=depth_stack, - nest_info=('attribute "%s" in ' - '(%s)' % (key, nest_info))) - - return depth_stack - - -def recursive_pickle(top_obj): - """ - Recursively pickle all of the given objects subordinates, starting with - the deepest first. **Very** handy for debugging pickling issues, but - also very slow (as it literally pickles each object in turn). - - Handles circular object references gracefully. - - """ - objs = depth_getter(top_obj) - # sort by depth then by nest_info - objs = sorted(six.itervalues(objs), key=lambda val: (-val[0], val[2])) - - for _, obj, location in objs: - try: - pickle.dump(obj, BytesIO(), pickle.HIGHEST_PROTOCOL) - except Exception as err: - print(obj) - print('Failed to pickle %s. \n Type: %s. Traceback ' - 'follows:' % (location, type(obj))) - raise - - def test_simple(): fig = plt.figure() - # un-comment to debug -# recursive_pickle(fig) pickle.dump(fig, BytesIO(), pickle.HIGHEST_PROTOCOL) ax = plt.subplot(121) @@ -106,13 +25,9 @@ def test_simple(): plt.plot(np.arange(10), label='foobar') plt.legend() - # Uncomment to debug any unpicklable objects. This is slow so is not - # uncommented by default. -# recursive_pickle(fig) pickle.dump(ax, BytesIO(), pickle.HIGHEST_PROTOCOL) # ax = plt.subplot(121, projection='hammer') -# recursive_pickle(ax, 'figure') # pickle.dump(ax, BytesIO(), pickle.HIGHEST_PROTOCOL) plt.figure() @@ -138,8 +53,9 @@ def test_complete(): data = u = v = np.linspace(0, 10, 80).reshape(10, 8) v = np.sin(v * -0.6) + # Ensure lists also pickle correctly. plt.subplot(3, 3, 1) - plt.plot(list(range(10))) # Ensure lists also pickle correctly. + plt.plot(list(range(10))) plt.subplot(3, 3, 2) plt.contourf(data, hatches=['//', 'ooo']) @@ -171,11 +87,9 @@ def test_complete(): plt.subplot(3, 3, 9) plt.errorbar(x, x * -0.5, xerr=0.2, yerr=0.4) - ###### plotting is done, now test its pickle-ability ######### - - # Uncomment to debug any unpicklable objects. This is slow (~200 seconds). -# recursive_pickle(fig) - + # + # plotting is done, now test its pickle-ability + # result_fh = BytesIO() pickle.dump(fig, result_fh, pickle.HIGHEST_PROTOCOL) @@ -227,7 +141,6 @@ def test_image(): def test_polar(): ax = plt.subplot(111, polar=True) fig = plt.gcf() - result = BytesIO() pf = pickle.dumps(fig) pickle.loads(pf) plt.draw() From 3227ed1f9988c67e3cd2ade7a65db5b1132c45a5 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 11:12:56 -0700 Subject: [PATCH 07/10] BUG: Duplicated test class in test_ticker.py --- lib/matplotlib/tests/test_ticker.py | 98 ++++++++++++++--------------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/lib/matplotlib/tests/test_ticker.py b/lib/matplotlib/tests/test_ticker.py index d6eee0d6d7bd..524ab750133e 100644 --- a/lib/matplotlib/tests/test_ticker.py +++ b/lib/matplotlib/tests/test_ticker.py @@ -239,56 +239,6 @@ def test_use_offset(self, use_offset): assert use_offset == tmp_form.get_useOffset() -class TestLogFormatter(object): - def _sub_labels(self, axis, subs=()): - "Test whether locator marks subs to be labeled" - fmt = axis.get_minor_formatter() - minor_tlocs = axis.get_minorticklocs() - fmt.set_locs(minor_tlocs) - coefs = minor_tlocs / 10**(np.floor(np.log10(minor_tlocs))) - label_expected = [np.round(c) in subs for c in coefs] - label_test = [fmt(x) != '' for x in minor_tlocs] - assert label_test == label_expected - - @pytest.mark.style('default') - def test_sublabel(self): - # test label locator - fig, ax = plt.subplots() - ax.set_xscale('log') - ax.xaxis.set_major_locator(mticker.LogLocator(base=10, subs=[])) - ax.xaxis.set_minor_locator(mticker.LogLocator(base=10, - subs=np.arange(2, 10))) - ax.xaxis.set_major_formatter(mticker.LogFormatter(labelOnlyBase=True)) - ax.xaxis.set_minor_formatter(mticker.LogFormatter(labelOnlyBase=False)) - # axis range above 3 decades, only bases are labeled - ax.set_xlim(1, 1e4) - fmt = ax.xaxis.get_major_formatter() - fmt.set_locs(ax.xaxis.get_majorticklocs()) - show_major_labels = [fmt(x) != '' - for x in ax.xaxis.get_majorticklocs()] - assert np.all(show_major_labels) - self._sub_labels(ax.xaxis, subs=[]) - - # For the next two, if the numdec threshold in LogFormatter.set_locs - # were 3, then the label sub would be 3 for 2-3 decades and (2,5) - # for 1-2 decades. With a threshold of 1, subs are not labeled. - # axis range at 2 to 3 decades - ax.set_xlim(1, 800) - self._sub_labels(ax.xaxis, subs=[]) - - # axis range at 1 to 2 decades - ax.set_xlim(1, 80) - self._sub_labels(ax.xaxis, subs=[]) - - # axis range at 0.4 to 1 decades, label subs 2, 3, 4, 6 - ax.set_xlim(1, 8) - self._sub_labels(ax.xaxis, subs=[2, 3, 4, 6]) - - # axis range at 0 to 0.4 decades, label all - ax.set_xlim(0.5, 0.9) - self._sub_labels(ax.xaxis, subs=np.arange(2, 10, dtype=int)) - - class FakeAxis(object): """Allow Formatter to be called without having a "full" plot set up.""" def __init__(self, vmin=1, vmax=10): @@ -503,6 +453,54 @@ def test_pprint(self, value, domain, expected): label = fmt.pprint_val(value, domain) assert label == expected + def _sub_labels(self, axis, subs=()): + "Test whether locator marks subs to be labeled" + fmt = axis.get_minor_formatter() + minor_tlocs = axis.get_minorticklocs() + fmt.set_locs(minor_tlocs) + coefs = minor_tlocs / 10**(np.floor(np.log10(minor_tlocs))) + label_expected = [np.round(c) in subs for c in coefs] + label_test = [fmt(x) != '' for x in minor_tlocs] + assert label_test == label_expected + + @pytest.mark.style('default') + def test_sublabel(self): + # test label locator + fig, ax = plt.subplots() + ax.set_xscale('log') + ax.xaxis.set_major_locator(mticker.LogLocator(base=10, subs=[])) + ax.xaxis.set_minor_locator(mticker.LogLocator(base=10, + subs=np.arange(2, 10))) + ax.xaxis.set_major_formatter(mticker.LogFormatter(labelOnlyBase=True)) + ax.xaxis.set_minor_formatter(mticker.LogFormatter(labelOnlyBase=False)) + # axis range above 3 decades, only bases are labeled + ax.set_xlim(1, 1e4) + fmt = ax.xaxis.get_major_formatter() + fmt.set_locs(ax.xaxis.get_majorticklocs()) + show_major_labels = [fmt(x) != '' + for x in ax.xaxis.get_majorticklocs()] + assert np.all(show_major_labels) + self._sub_labels(ax.xaxis, subs=[]) + + # For the next two, if the numdec threshold in LogFormatter.set_locs + # were 3, then the label sub would be 3 for 2-3 decades and (2,5) + # for 1-2 decades. With a threshold of 1, subs are not labeled. + # axis range at 2 to 3 decades + ax.set_xlim(1, 800) + self._sub_labels(ax.xaxis, subs=[]) + + # axis range at 1 to 2 decades + ax.set_xlim(1, 80) + self._sub_labels(ax.xaxis, subs=[]) + + # axis range at 0.4 to 1 decades, label subs 2, 3, 4, 6 + ax.set_xlim(1, 8) + self._sub_labels(ax.xaxis, subs=[2, 3, 4, 6]) + + # axis range at 0 to 0.4 decades, label all + ax.set_xlim(0.5, 0.9) + self._sub_labels(ax.xaxis, subs=np.arange(2, 10, dtype=int)) + class TestFormatStrFormatter(object): def test_basic(self): From ca858b798de44fadc2325d26943a82ffef59698c Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 11:19:37 -0700 Subject: [PATCH 08/10] BUG: Fix animation test Lack of saving the animation caused it to never run the callbacks. --- lib/matplotlib/tests/test_animation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/tests/test_animation.py b/lib/matplotlib/tests/test_animation.py index 7e8c2ea235df..61ad1e56ee49 100644 --- a/lib/matplotlib/tests/test_animation.py +++ b/lib/matplotlib/tests/test_animation.py @@ -162,6 +162,8 @@ def animate(i): anim = animation.FuncAnimation(fig, animate, init_func=init, frames=iter(range(5))) + writer = NullMovieWriter() + anim.save('unused.null', writer=writer) def test_movie_writer_registry(): From af56c132c534c7f44c4fafcbe9c5df1723e96d1a Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 11:31:30 -0700 Subject: [PATCH 09/10] MNT: More testing cleanups for coverage. Remove unused code and restructure to eliminate uncovered lines. --- lib/matplotlib/tests/test_collections.py | 10 ---------- lib/matplotlib/tests/test_triangulation.py | 4 ++-- lib/matplotlib/tests/test_widgets.py | 4 +--- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/tests/test_collections.py b/lib/matplotlib/tests/test_collections.py index be1e5fce3d8b..af9dabc904c1 100644 --- a/lib/matplotlib/tests/test_collections.py +++ b/lib/matplotlib/tests/test_collections.py @@ -383,16 +383,6 @@ def check_segments(coll, positions, linelength, lineoffset, orientation): assert_equal(segment[1, pos2], positions[i]) -def check_allprop(values, target): - ''' - check to make sure all values match the given target - - note: this is not a test, it is used by tests - ''' - for value in values: - assert_equal(value, target) - - def check_allprop_array(values, target): ''' check to make sure all values match the given target if arrays diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index a32061801b52..14b0b6361c53 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -966,8 +966,8 @@ def test_triplot_return(): triang = mtri.Triangulation( [0.0, 1.0, 0.0, 1.0], [0.0, 0.0, 1.0, 1.0], triangles=[[0, 1, 3], [3, 2, 0]]) - if ax.triplot(triang, "b-") is None: - raise AssertionError("triplot should return the artist it adds") + assert ax.triplot(triang, "b-") is not None, \ + 'triplot should return the artist it adds' def test_trirefiner_fortran_contiguous_triangles(): diff --git a/lib/matplotlib/tests/test_widgets.py b/lib/matplotlib/tests/test_widgets.py index 5fb41eb26b40..e8b7d8aebc7e 100644 --- a/lib/matplotlib/tests/test_widgets.py +++ b/lib/matplotlib/tests/test_widgets.py @@ -261,9 +261,7 @@ def test_CheckButtons(): check.set_active(0) assert check.get_status() == [False, False, True] - def clicked_function(): - pass - cid = check.on_clicked(clicked_function) + cid = check.on_clicked(lambda: None) check.disconnect(cid) From 9f316f9c07daf4196f8de8227e5b6985bc37ef5a Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 7 Feb 2017 13:28:32 -0700 Subject: [PATCH 10/10] MNT: Pep8 a few tests Since we're here making changes anyways. --- lib/matplotlib/tests/test_axes.py | 218 ++++++++++++--------- lib/matplotlib/tests/test_triangulation.py | 29 ++- pytest.ini | 2 - 3 files changed, 146 insertions(+), 103 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 54c77e69b1c9..5dcb34981145 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -27,7 +27,6 @@ import matplotlib.colors as mcolors from numpy.testing import assert_allclose, assert_array_equal from matplotlib.cbook import IgnoredKeywordWarning -import matplotlib.colors as mcolors # Note: Some test cases are run twice: once normally and once with labeled data # These two must be defined in the same test function or need to have @@ -110,7 +109,8 @@ def test_twin_axis_locaters_formatters(): ax1.yaxis.set_major_locator(majl) ax1.yaxis.set_minor_locator(minl) ax1.yaxis.set_major_formatter(plt.FormatStrFormatter('%08.2lf')) - ax1.yaxis.set_minor_formatter(plt.FixedFormatter(['tricks', 'mind', 'jedi'])) + ax1.yaxis.set_minor_formatter(plt.FixedFormatter(['tricks', 'mind', + 'jedi'])) ax1.xaxis.set_major_locator(plt.LinearLocator()) ax1.xaxis.set_minor_locator(plt.FixedLocator([15, 35, 55, 75])) @@ -178,7 +178,8 @@ def test_twin_inherit_autoscale_setting(): assert not ax_y_off.get_autoscaley_on() -@image_comparison(baseline_images=["minorticks_on_rcParams_both"], extensions=['png']) +@image_comparison(baseline_images=["minorticks_on_rcParams_both"], + extensions=['png']) def test_minorticks_on_rcParams_both(): fig = plt.figure() matplotlib.rcParams['xtick.minor.visible'] = True @@ -244,6 +245,7 @@ def test_use_sticky_edges(): assert_allclose(ax.get_xlim(), (-0.5, 1.5)) assert_allclose(ax.get_ylim(), (-0.5, 1.5)) + @image_comparison(baseline_images=['offset_points'], remove_text=True) def test_basic_annotate(): @@ -358,20 +360,21 @@ def test_fill_units(): # Top-Right ax2 = fig.add_subplot(222) ax2.plot([t], [value], yunits='deg', color='red') - ax2.fill([t, t, t+day, t+day], - [0.0, 0.0, 90.0, 0.0], 'b') + ax2.fill([t, t, t + day, t + day], + [0.0, 0.0, 90.0, 0.0], 'b') # Bottom-Left ax3 = fig.add_subplot(223) ax3.plot([t], [value], yunits='deg', color='red') ax3.fill([733525.0, 733525.0, 733526.0, 733526.0], - [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], 'b') + [0 * units.deg, 0 * units.deg, 90 * units.deg, 0 * units.deg], + 'b') # Bottom-Right ax4 = fig.add_subplot(224) ax4.plot([t], [value], yunits='deg', color='red') - ax4.fill([t, t, t+day, t+day], - [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], + ax4.fill([t, t, t + day, t + day], + [0 * units.deg, 0 * units.deg, 90 * units.deg, 0 * units.deg], facecolor="blue") fig.autofmt_xdate() @@ -391,14 +394,14 @@ def test_single_point(): plt.plot([1], [1], 'o') # Reuse testcase from above for a labeled data test - data = {'a':[0], 'b':[1]} + data = {'a': [0], 'b': [1]} fig = plt.figure() plt.subplot(211) plt.plot('a', 'a', 'o', data=data) plt.subplot(212) - plt.plot('b','b', 'o', data=data) + plt.plot('b', 'b', 'o', data=data) @image_comparison(baseline_images=['single_date']) @@ -416,26 +419,36 @@ def test_single_date(): @image_comparison(baseline_images=['shaped_data']) def test_shaped_data(): - xdata = np.array([[0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, - 0.73136095, 0.60823287, 0.01792100, 0.29744742, 0.27164665], - [0.27980120, 0.25814229, 0.02818193, 0.12966456, 0.57446277, - 0.58167607, 0.71028245, 0.69112737, 0.89923072, 0.99072476], - [0.81218578, 0.80464528, 0.76071809, 0.85616314, 0.12757994, - 0.94324936, 0.73078663, 0.09658102, 0.60703967, 0.77664978], - [0.28332265, 0.81479711, 0.86985333, 0.43797066, 0.32540082, - 0.43819229, 0.92230363, 0.49414252, 0.68168256, 0.05922372], - [0.10721335, 0.93904142, 0.79163075, 0.73232848, 0.90283839, - 0.68408046, 0.25502302, 0.95976614, 0.59214115, 0.13663711], - [0.28087456, 0.33127607, 0.15530412, 0.76558121, 0.83389773, - 0.03735974, 0.98717738, 0.71432229, 0.54881366, 0.86893953], - [0.77995937, 0.99555600, 0.29688434, 0.15646162, 0.05184800, - 0.37161935, 0.12998491, 0.09377296, 0.36882507, 0.36583435], - [0.37851836, 0.05315792, 0.63144617, 0.25003433, 0.69586032, - 0.11393988, 0.92362096, 0.88045438, 0.93530252, 0.68275072], - [0.86486596, 0.83236675, 0.82960664, 0.57796630, 0.25724233, - 0.84841095, 0.90862812, 0.64414887, 0.35652720, 0.71026066], - [0.01383268, 0.34060930, 0.76084285, 0.70800694, 0.87634056, - 0.08213693, 0.54655021, 0.98123181, 0.44080053, 0.86815815]]) + xdata = np.array([[0.53295185, 0.23052951, 0.19057629, 0.66724975, + 0.96577916, 0.73136095, 0.60823287, 0.01792100, + 0.29744742, 0.27164665], + [0.27980120, 0.25814229, 0.02818193, 0.12966456, + 0.57446277, 0.58167607, 0.71028245, 0.69112737, + 0.89923072, 0.99072476], + [0.81218578, 0.80464528, 0.76071809, 0.85616314, + 0.12757994, 0.94324936, 0.73078663, 0.09658102, + 0.60703967, 0.77664978], + [0.28332265, 0.81479711, 0.86985333, 0.43797066, + 0.32540082, 0.43819229, 0.92230363, 0.49414252, + 0.68168256, 0.05922372], + [0.10721335, 0.93904142, 0.79163075, 0.73232848, + 0.90283839, 0.68408046, 0.25502302, 0.95976614, + 0.59214115, 0.13663711], + [0.28087456, 0.33127607, 0.15530412, 0.76558121, + 0.83389773, 0.03735974, 0.98717738, 0.71432229, + 0.54881366, 0.86893953], + [0.77995937, 0.99555600, 0.29688434, 0.15646162, + 0.05184800, 0.37161935, 0.12998491, 0.09377296, + 0.36882507, 0.36583435], + [0.37851836, 0.05315792, 0.63144617, 0.25003433, + 0.69586032, 0.11393988, 0.92362096, 0.88045438, + 0.93530252, 0.68275072], + [0.86486596, 0.83236675, 0.82960664, 0.57796630, + 0.25724233, 0.84841095, 0.90862812, 0.64414887, + 0.35652720, 0.71026066], + [0.01383268, 0.34060930, 0.76084285, 0.70800694, + 0.87634056, 0.08213693, 0.54655021, 0.98123181, + 0.44080053, 0.86815815]]) y1 = np.arange(10).reshape((1, -1)) y2 = np.arange(10).reshape((-1, 1)) @@ -518,7 +531,8 @@ def test_polar_units(): # make sure runits and theta units work y1 = [y*km for y in y1] plt.polar(x2, y1, color="blue", thetaunits="rad", runits="km") - assert isinstance(plt.gca().get_xaxis().get_major_formatter(), units.UnitDblFormatter) + assert isinstance(plt.gca().get_xaxis().get_major_formatter(), + units.UnitDblFormatter) @image_comparison(baseline_images=['polar_rmin']) @@ -613,12 +627,13 @@ def test_hexbin_extent(): @image_comparison(baseline_images=['hexbin_empty'], remove_text=True, - extensions=['png']) + extensions=['png']) def test_hexbin_empty(): # From #3886: creating hexbin from empty dataset raises ValueError ax = plt.gca() ax.hexbin([], []) + def test_hexbin_pickable(): # From #1973: Test that picking a hexbin collection works class FauxMouseEvent: @@ -678,7 +693,8 @@ def test_inverted_limits(): @image_comparison(baseline_images=['nonfinite_limits']) def test_nonfinite_limits(): x = np.arange(0., np.e, 0.01) - olderr = np.seterr(divide='ignore') # silence divide by zero warning from log(0) + # silence divide by zero warning from log(0) + olderr = np.seterr(divide='ignore') try: y = np.log(x) finally: @@ -706,7 +722,7 @@ def test_imshow(): ax.imshow(r) # Reuse testcase from above for a labeled data test - data={"r": r} + data = {"r": r} fig = plt.figure() ax = fig.add_subplot(111) ax.imshow("r", data=data) @@ -801,8 +817,10 @@ def test_fill_between_interpolate(): fig = plt.figure() ax = fig.add_subplot(211) ax.plot(x, y1, x, y2, color='black') - ax.fill_between(x, y1, y2, where=y2 >= y1, facecolor='white', hatch='/', interpolate=True) - ax.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', interpolate=True) + ax.fill_between(x, y1, y2, where=y2 >= y1, facecolor='white', hatch='/', + interpolate=True) + ax.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', + interpolate=True) # Test support for masked arrays. y2 = np.ma.masked_greater(y2, 1.0) @@ -810,8 +828,10 @@ def test_fill_between_interpolate(): y2[0] = np.ma.masked ax1 = fig.add_subplot(212, sharex=ax) ax1.plot(x, y1, x, y2, color='black') - ax1.fill_between(x, y1, y2, where=y2 >= y1, facecolor='green', interpolate=True) - ax1.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', interpolate=True) + ax1.fill_between(x, y1, y2, where=y2 >= y1, facecolor='green', + interpolate=True) + ax1.fill_between(x, y1, y2, where=y2 <= y1, facecolor='red', + interpolate=True) @image_comparison(baseline_images=['symlog']) @@ -1006,7 +1026,8 @@ def test_arc_ellipse(): fig = plt.figure() ax = fig.add_subplot(211, aspect='auto') - ax.fill(x, y, alpha=0.2, facecolor='yellow', edgecolor='yellow', linewidth=1, zorder=1) + ax.fill(x, y, alpha=0.2, facecolor='yellow', edgecolor='yellow', + linewidth=1, zorder=1) e1 = patches.Arc((xcenter, ycenter), width, height, angle=angle, linewidth=2, fill=False, zorder=2) @@ -1221,19 +1242,21 @@ def test_hist_log(): @image_comparison(baseline_images=['hist_bar_empty'], remove_text=True, - extensions=['png']) + extensions=['png']) def test_hist_bar_empty(): # From #3886: creating hist from empty dataset raises ValueError ax = plt.gca() ax.hist([], histtype='bar') + @image_comparison(baseline_images=['hist_step_empty'], remove_text=True, - extensions=['png']) + extensions=['png']) def test_hist_step_empty(): # From #3886: creating hist from empty dataset raises ValueError ax = plt.gca() ax.hist([], histtype='step') + @image_comparison(baseline_images=['hist_steplog'], remove_text=True, tol=0.1) def test_hist_steplog(): np.random.seed(0) @@ -1253,7 +1276,8 @@ def test_hist_steplog(): plt.hist(data, 100, weights=weights, histtype='stepfilled', log=True) ax = plt.subplot(4, 1, 4) - plt.hist(data_big, 100, histtype='stepfilled', log=True, orientation='horizontal') + plt.hist(data_big, 100, histtype='stepfilled', log=True, + orientation='horizontal') @image_comparison(baseline_images=['hist_step_filled'], remove_text=True, @@ -1464,7 +1488,8 @@ def _as_mpl_axes(self): ax_via_gca = plt.gca(projection=prj2) assert ax_via_gca is not ax assert ax.get_theta_offset() == 0, ax.get_theta_offset() - assert ax_via_gca.get_theta_offset() == np.pi, ax_via_gca.get_theta_offset() + assert ax_via_gca.get_theta_offset() == np.pi, \ + ax_via_gca.get_theta_offset() # try getting the axes given an == (not is) polar projection ax_via_gca = plt.gca(projection=prj3) assert ax_via_gca is ax @@ -1501,7 +1526,7 @@ def test_stackplot(): ax.set_ylim((0, 70)) # Reuse testcase from above for a labeled data test - data={"x": x, "y1": y1, "y2": y2, "y3": y3} + data = {"x": x, "y1": y1, "y2": y2, "y3": y3} fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.stackplot("x", "y1", "y2", "y3", data=data) @@ -1529,7 +1554,7 @@ def bump(a): return a d = layers(3, 100) - d[50,:] = 0 # test for fixed weighted wiggle (issue #6313) + d[50, :] = 0 # test for fixed weighted wiggle (issue #6313) fig = plt.figure() @@ -2005,6 +2030,7 @@ def test_boxplot_autorange_whiskers(): ax2.boxplot([x, x], bootstrap=10000, notch=1, autorange=True) ax2.set_ylim((-5, 5)) + def _rc_test_bxp_helper(ax, rc_dict): x = np.linspace(-7, 7, 140) x = np.hstack([-25, x, 25]) @@ -2012,6 +2038,7 @@ def _rc_test_bxp_helper(ax, rc_dict): ax.boxplot([x, x]) return ax + @image_comparison(baseline_images=['boxplot_rc_parameters'], savefig_kwarg={'dpi': 100}, remove_text=True, tol=1, style='default') @@ -2022,7 +2049,7 @@ def test_boxplot_rc_parameters(): fig, ax = plt.subplots(3) rc_axis0 = { - 'boxplot.notch':True, + 'boxplot.notch': True, 'boxplot.whiskers': [5, 95], 'boxplot.bootstrap': 10000, @@ -2407,7 +2434,6 @@ def test_errorbar(): fig.suptitle('Variable errorbars') - # Reuse te first testcase from above for a labeled data test data = {"x": x, "y": y} fig = plt.figure() @@ -2510,7 +2536,8 @@ def test_hist_offset(): ax.hist(d2, bottom=15) -@image_comparison(baseline_images=['hist_step'], extensions=['png'], remove_text=True) +@image_comparison(baseline_images=['hist_step'], extensions=['png'], + remove_text=True) def test_hist_step(): # make some data d1 = np.linspace(1, 3, 20) @@ -2599,7 +2626,8 @@ def test_hist_stacked_normed(): ax.hist((d1, d2), stacked=True, normed=True) -@image_comparison(baseline_images=['hist_step_bottom'], extensions=['png'], remove_text=True) +@image_comparison(baseline_images=['hist_step_bottom'], extensions=['png'], + remove_text=True) def test_hist_step_bottom(): # make some data d1 = np.linspace(1, 3, 20) @@ -2622,7 +2650,8 @@ def test_hist_stacked_bar(): labels = ['green', 'orange', ' yellow', 'magenta', 'black'] fig = plt.figure() ax = fig.add_subplot(111) - ax.hist(d, bins=10, histtype='barstacked', align='mid', color=colors, label=labels) + ax.hist(d, bins=10, histtype='barstacked', align='mid', color=colors, + label=labels) ax.legend(loc='upper right', bbox_to_anchor=(1.0, 1.0), ncol=1) @@ -2653,11 +2682,12 @@ def test_rgba_markers(): for j, rcolor in enumerate(rcolors): for k, bcolor in enumerate(bcolors): axs[i].plot(j+1, k+1, 'o', mfc=bcolor, mec=rcolor, - alpha=alpha, **kw) + alpha=alpha, **kw) axs[i].plot(j+1, k+3, 'x', mec=rcolor, alpha=alpha, **kw) for ax in axs: ax.axis([-1, 4, 0, 5]) + @image_comparison(baseline_images=['mollweide_grid'], remove_text=True) def test_mollweide_grid(): # test that both horizontal and vertical gridlines appear on the Mollweide @@ -2788,7 +2818,8 @@ def test_eventplot(): assert num_collections == num_datasets -@image_comparison(baseline_images=['test_eventplot_defaults'], extensions=['png'], remove_text=True) +@image_comparison(baseline_images=['test_eventplot_defaults'], + extensions=['png'], remove_text=True) def test_eventplot_defaults(): ''' test that eventplot produces the correct output given the default params @@ -2805,7 +2836,8 @@ def test_eventplot_defaults(): colls = axobj.eventplot(data) -@image_comparison(baseline_images=['test_eventplot_problem_kwargs'], extensions=['png'], remove_text=True) +@image_comparison(baseline_images=['test_eventplot_problem_kwargs'], + extensions=['png'], remove_text=True) def test_eventplot_problem_kwargs(): ''' test that 'singular' versions of LineCollection props raise an @@ -2842,14 +2874,15 @@ def test_empty_eventplot(): plt.draw() -@image_comparison(baseline_images=['marker_styles'], extensions=['png'], remove_text=True) +@image_comparison(baseline_images=['marker_styles'], extensions=['png'], + remove_text=True) def test_marker_styles(): fig = plt.figure() ax = fig.add_subplot(111) for y, marker in enumerate(sorted(matplotlib.markers.MarkerStyle.markers, key=lambda x: str(type(x))+str(x))): - ax.plot((y % 2)*5 + np.arange(10)*10, np.ones(10)*10*y, linestyle='', marker=marker, - markersize=10+y/5, label=marker) + ax.plot((y % 2)*5 + np.arange(10)*10, np.ones(10)*10*y, linestyle='', + marker=marker, markersize=10+y/5, label=marker) @image_comparison(baseline_images=['rc_markerfill'], extensions=['png']) @@ -2857,7 +2890,7 @@ def test_markers_fillstyle_rcparams(): fig, ax = plt.subplots() x = np.arange(7) for idx, (style, marker) in enumerate( - [('top', 's'), ('bottom', 'o'), ('none', '^')]): + [('top', 's'), ('bottom', 'o'), ('none', '^')]): matplotlib.rcParams['markers.fillstyle'] = style ax.plot(x+idx, marker=marker) @@ -3937,9 +3970,9 @@ def make_patch_spines_invisible(ax): # Offset the right spine of par2. The ticks and label have already been # placed on the right by twinx above. par2.spines["right"].set_position(("axes", 1.2)) - # Having been created by twinx, par2 has its frame off, so the line of its - # detached spine is invisible. First, activate the frame but make the patch - # and spines invisible. + # Having been created by twinx, par2 has its frame off, so the line of + # its detached spine is invisible. First, activate the frame but make + # the patch and spines invisible. make_patch_spines_invisible(par2) # Second, show the right spine. par2.spines["right"].set_visible(True) @@ -4094,8 +4127,8 @@ def test_pie_linewidth_0(): fig = plt.figure() ax = fig.gca() ax.pie("s", explode="ex", labels="l", colors="c", - autopct='%1.1f%%', shadow=True, startangle=90, - wedgeprops={'linewidth': 0}, data=data) + autopct='%1.1f%%', shadow=True, startangle=90, + wedgeprops={'linewidth': 0}, data=data) ax.axis('equal') # And again to test the pyplot functions which should also be able to be @@ -4113,13 +4146,13 @@ def test_pie_center_radius(): labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' sizes = [15, 30, 45, 10] colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'] - explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs') + explode = (0, 0.1, 0, 0) # only "explode" the 2nd slice (i.e. 'Hogs') plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90, - wedgeprops={'linewidth': 0}, center=(1,2), radius=1.5) + wedgeprops={'linewidth': 0}, center=(1, 2), radius=1.5) - plt.annotate("Center point", xy=(1,2), xytext=(1,1.5), + plt.annotate("Center point", xy=(1, 2), xytext=(1, 1.5), arrowprops=dict(arrowstyle="->", connectionstyle="arc3")) # Set aspect ratio to be equal so that pie is drawn as a circle. @@ -4199,10 +4232,10 @@ def test_set_get_ticklabels(): ax[0].set_xticklabels(('a', 'b', 'c', 'd')) ax[0].set_yticklabels(('11', '12', '13', '14')) - # set ticklabel to the other plot, expect the 2 plots have same label setting - # pass get_ticklabels return value as ticklabels argument - ax[1].set_xticklabels(ax[0].get_xticklabels() ) - ax[1].set_yticklabels(ax[0].get_yticklabels() ) + # set ticklabel to the other plot, expect the 2 plots have same label + # setting pass get_ticklabels return value as ticklabels argument + ax[1].set_xticklabels(ax[0].get_xticklabels()) + ax[1].set_yticklabels(ax[0].get_yticklabels()) @image_comparison(baseline_images=['o_marker_path_snap'], extensions=['png'], @@ -4259,7 +4292,7 @@ def test_pathological_hexbin(): def test_color_None(): # issue 3855 fig, ax = plt.subplots() - ax.plot([1,2], [1,2], color=None) + ax.plot([1, 2], [1, 2], color=None) def test_color_alias(): @@ -4298,13 +4331,13 @@ def test_move_offsetlabel(): @image_comparison(baseline_images=['rc_spines'], extensions=['png'], - savefig_kwarg={'dpi':40}) + savefig_kwarg={'dpi': 40}) def test_rc_spines(): rc_dict = { - 'axes.spines.left':False, - 'axes.spines.right':False, - 'axes.spines.top':False, - 'axes.spines.bottom':False} + 'axes.spines.left': False, + 'axes.spines.right': False, + 'axes.spines.top': False, + 'axes.spines.bottom': False} with matplotlib.rc_context(rc_dict): fig, ax = plt.subplots() @@ -4343,15 +4376,15 @@ def test_rc_tick(): xax = ax1.xaxis yax = ax1.yaxis # tick1On bottom/left - assert xax._major_tick_kw['tick1On'] == False - assert xax._major_tick_kw['tick2On'] == True - assert xax._minor_tick_kw['tick1On'] == False - assert xax._minor_tick_kw['tick2On'] == True + assert not xax._major_tick_kw['tick1On'] + assert xax._major_tick_kw['tick2On'] + assert not xax._minor_tick_kw['tick1On'] + assert xax._minor_tick_kw['tick2On'] - assert yax._major_tick_kw['tick1On'] == True - assert yax._major_tick_kw['tick2On'] == False - assert yax._minor_tick_kw['tick1On'] == True - assert yax._minor_tick_kw['tick2On'] == False + assert yax._major_tick_kw['tick1On'] + assert not yax._major_tick_kw['tick2On'] + assert yax._minor_tick_kw['tick1On'] + assert not yax._minor_tick_kw['tick2On'] def test_rc_major_minor_tick(): @@ -4366,15 +4399,15 @@ def test_rc_major_minor_tick(): xax = ax1.xaxis yax = ax1.yaxis # tick1On bottom/left - assert xax._major_tick_kw['tick1On'] == False - assert xax._major_tick_kw['tick2On'] == True - assert xax._minor_tick_kw['tick1On'] == False - assert xax._minor_tick_kw['tick2On'] == True + assert not xax._major_tick_kw['tick1On'] + assert xax._major_tick_kw['tick2On'] + assert not xax._minor_tick_kw['tick1On'] + assert xax._minor_tick_kw['tick2On'] - assert yax._major_tick_kw['tick1On'] == False - assert yax._major_tick_kw['tick2On'] == True - assert yax._minor_tick_kw['tick1On'] == False - assert yax._minor_tick_kw['tick2On'] == True + assert not yax._major_tick_kw['tick1On'] + assert yax._major_tick_kw['tick2On'] + assert not yax._minor_tick_kw['tick1On'] + assert yax._minor_tick_kw['tick2On'] def test_bar_negative_width(): @@ -4687,7 +4720,8 @@ def test_pandas_indexing_hist(): def test_axis_set_tick_params_labelsize_labelcolor(): # Tests fix for issue 4346 axis_1 = plt.subplot() - axis_1.yaxis.set_tick_params(labelsize=30, labelcolor='red', direction='out') + axis_1.yaxis.set_tick_params(labelsize=30, labelcolor='red', + direction='out') # Expected values after setting the ticks assert axis_1.yaxis.majorTicks[0]._size == 4.0 diff --git a/lib/matplotlib/tests/test_triangulation.py b/lib/matplotlib/tests/test_triangulation.py index 14b0b6361c53..831a01c97efc 100644 --- a/lib/matplotlib/tests/test_triangulation.py +++ b/lib/matplotlib/tests/test_triangulation.py @@ -1,8 +1,6 @@ from __future__ import (absolute_import, division, print_function, unicode_literals) -import six - import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as mtri @@ -17,6 +15,7 @@ import sys on_win = (sys.platform == 'win32') + def test_delaunay(): # No duplicate points, regular grid. nx = 5 @@ -236,10 +235,15 @@ def test_trifinder(): tris = trifinder(xs, ys) assert_array_equal(tris, [0, 17]) + # # Test triangles with horizontal colinear points. These are not valid # triangulations, but we try to deal with the simplest violations. - delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid, - # if zero have colinear points but should pass tests anyway. + # + + # If +ve, triangulation is OK, if -ve triangulation invalid, + # if zero have colinear points but should pass tests anyway. + delta = 0.0 + x = [1.5, 0, 1, 2, 3, 1.5, 1.5] y = [-1, 0, 0, 0, 0, delta, 1] triangles = [[0, 2, 1], [0, 3, 2], [0, 4, 3], [1, 2, 5], [2, 3, 5], @@ -254,10 +258,15 @@ def test_trifinder(): assert_array_equal(tris, [[-1, 0, 0, 1, 1, 2, -1], [-1, 6, 6, 6, 7, 7, -1]]) + # # Test triangles with vertical colinear points. These are not valid # triangulations, but we try to deal with the simplest violations. - delta = 0.0 # If +ve, triangulation is OK, if -ve triangulation invalid, - # if zero have colinear points but should pass tests anyway. + # + + # If +ve, triangulation is OK, if -ve triangulation invalid, + # if zero have colinear points but should pass tests anyway. + delta = 0.0 + x = [-1, -delta, 0, 0, 0, 0, 1] y = [1.5, 1.5, 0, 1, 2, 3, 1.5] triangles = [[0, 1, 2], [0, 1, 5], [1, 2, 3], [1, 3, 4], [1, 4, 5], @@ -281,7 +290,7 @@ def test_trifinder(): trifinder = triang.get_trifinder() xs = [-0.2, 0.2, 0.8, 1.2] - ys = [ 0.5, 0.5, 0.5, 0.5] + ys = [0.5, 0.5, 0.5, 0.5] tris = trifinder(xs, ys) assert_array_equal(tris, [-1, 0, 1, -1]) @@ -591,8 +600,10 @@ def test_triinterp_colinear(): # We also test interpolation inside a flat triangle, by forcing # *tri_index* in a call to :meth:`_interpolate_multikeys`. - delta = 0. # If +ve, triangulation is OK, if -ve triangulation invalid, - # if zero have colinear points but should pass tests anyway. + # If +ve, triangulation is OK, if -ve triangulation invalid, + # if zero have colinear points but should pass tests anyway. + delta = 0. + x0 = np.array([1.5, 0, 1, 2, 3, 1.5, 1.5]) y0 = np.array([-1, 0, 0, 0, 0, delta, 1]) diff --git a/pytest.ini b/pytest.ini index d9132bfa6002..ee59757e96ae 100644 --- a/pytest.ini +++ b/pytest.ini @@ -44,13 +44,11 @@ pep8ignore = matplotlib/testing/jpl_units/UnitDbl.py E201 E202 E203 matplotlib/testing/jpl_units/UnitDblConverter.py E201 E202 E203 E251 E302 E501 E711 matplotlib/testing/jpl_units/UnitDblFormatter.py E201 E202 E251 E302 - matplotlib/tests/test_axes.py E101 E202 E225 E231 E261 E302 E303 E501 E712 W191 matplotlib/tests/test_image.py E225 E231 E251 E302 E303 E501 E502 matplotlib/tests/test_lines.py E231 E261 matplotlib/tests/test_mathtext.py E261 E302 E501 matplotlib/tests/test_rcparams.py E231 E501 matplotlib/tests/test_tightlayout.py E302 - matplotlib/tests/test_triangulation.py E201 E302 matplotlib/tri/triinterpolate.py E201 E221 matplotlib/_cm.py E101 E202 E203 W191 matplotlib/_mathtext_data.py E203 E231 E261 E501 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy