From 2a609051ddc29f317a72c3236b22d6770af72744 Mon Sep 17 00:00:00 2001 From: Saim Momin Date: Thu, 23 Jan 2025 12:48:24 +0100 Subject: [PATCH 1/2] Add pytests for fingerprint plot --- .../test_data/plotFingerprint_result1.png | Bin 0 -> 22385 bytes .../test_data/plotFingerprint_result2.png | Bin 0 -> 25103 bytes .../deeptools/test/test_fingerprintplot.py | 56 ++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 pydeeptools/deeptools/test/test_data/plotFingerprint_result1.png create mode 100644 pydeeptools/deeptools/test/test_data/plotFingerprint_result2.png create mode 100644 pydeeptools/deeptools/test/test_fingerprintplot.py diff --git a/pydeeptools/deeptools/test/test_data/plotFingerprint_result1.png b/pydeeptools/deeptools/test/test_data/plotFingerprint_result1.png new file mode 100644 index 0000000000000000000000000000000000000000..4608c1c7e5b7dc683dd0d2b461d3670cceddaf1f GIT binary patch literal 22385 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 KI{u{IjsF3>IVOPs literal 0 HcmV?d00001 diff --git a/pydeeptools/deeptools/test/test_data/plotFingerprint_result2.png b/pydeeptools/deeptools/test/test_data/plotFingerprint_result2.png new file mode 100644 index 0000000000000000000000000000000000000000..3efef8368788ba58029df92168789ae46143c42d GIT binary patch literal 25103 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 jhJJct{MY}!y|!+^a Date: Fri, 24 Jan 2025 10:50:37 +0100 Subject: [PATCH 2/2] Replace file size test with image compare --- .../deeptools/test/test_fingerprintplot.py | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/pydeeptools/deeptools/test/test_fingerprintplot.py b/pydeeptools/deeptools/test/test_fingerprintplot.py index b99ac0c79e..a66ab65196 100644 --- a/pydeeptools/deeptools/test/test_fingerprintplot.py +++ b/pydeeptools/deeptools/test/test_fingerprintplot.py @@ -2,6 +2,7 @@ import os.path from os import unlink +from matplotlib.testing.compare import compare_images ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data/" @@ -18,11 +19,8 @@ def test_fingerprint_plot_with_minimal_options(): args = "-b {} {} -o {}".format(BAM_IN1, BAM_IN1, out_png).split() pf.main(args) - png_file_size = os.path.getsize(FIN_PLOT1) - expected_file_size = os.path.getsize(out_png) - size_tolerance = 15000 - size_difference = abs(png_file_size - expected_file_size) - assert size_difference <= size_tolerance, "File size do not match" + res = compare_images(FIN_PLOT1, out_png, 50) + assert res is None, "Plots do not match" unlink(out_png) @@ -33,24 +31,21 @@ def test_fingerprint_plot_with_advance_options(): out_rawcounts = '/tmp/rawcounts.tsv' out_qualitymetric = '/tmp/qualitymetrics.tsv' out_png2 = '/tmp/fingerprint_plot2.png' - args = "-b {} {} -o {} --outRawCounts {} --outQualityMetrics {} -T Test_Fingerpring_Plot --JSDsample {}".format(BAM_IN1, BAM_IN1, out_png2, out_rawcounts, out_qualitymetric, BAM_IN1).split() + args = "-b {0} {0} -o {1} --outRawCounts {2} --outQualityMetrics {3} -T Test_Fingerpring_Plot --JSDsample {0}".format(BAM_IN1, out_png2, out_rawcounts, out_qualitymetric).split() pf.main(args) - with open(out_rawcounts, "r") as _foo: - result = len(_foo.readlines()) - _expected = 16072 - assert result == _expected, "No of lines in rawcounts files differ" + _foo = open(out_rawcounts, "r") + result = _foo.readlines()[2:7] + _expected = ["1327\t1327\n", "2015\t2015\n", "2928\t2928\n", "4419\t4419\n","8644\t8644\n"] + assert result == _expected, "Contens in rawcounts files differ" with open(out_qualitymetric, "r") as _foo: result2 = len(_foo.readlines()) _expected = 3 assert result2 == _expected, "No of lines in quality metrics files differ" - png_file_size = os.path.getsize(FIN_PLOT2) - expected_file_size = os.path.getsize(out_png2) - size_tolerance = 15000 - size_difference = abs(png_file_size - expected_file_size) - assert size_difference <= size_tolerance, "File sizes do not match" + res = compare_images(FIN_PLOT2, out_png2, 50) + assert res is None, "Plots do not match" unlink(out_png2) unlink(out_rawcounts) - unlink(out_rawcounts) + unlink(out_qualitymetric)