--- a +++ b/tests/test_barcodeFileParser.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import unittest +import itertools +import singlecellmultiomics.barcodeFileParser.barcodeFileParser as barcodeFileParser +import pkg_resources + +""" +These tests check if the barcode file parser is working correctly +""" + +class TestBarcodeParser(unittest.TestCase): + + def test_insert(self): + + b = barcodeFileParser.BarcodeParser() + + b.addBarcode( + barcodeFileAlias = 'test', + barcode='AAA', + index='TEST1') + + + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('AAA','test') + self.assertEqual(index,'TEST1') + self.assertEqual(barcode,'AAA') + self.assertEqual(hd,0) + + def test_hamming_expansion(self): + + b = barcodeFileParser.BarcodeParser() + b.addBarcode( barcodeFileAlias = 'test', barcode='AAA', index='TEST1') + b.expand(1,'test') + # Postive examples: + for positive in ['AAT','CAA','AGA','TAA']: + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance(positive,'test') + self.assertEqual(index,'TEST1') + self.assertEqual(barcode,'AAA') + self.assertEqual(hd,1) + + #Negative examples + for negative in ['TAT','CCA','GGA','TCA']: + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance(negative,'test') + self.assertNotEqual(barcode,'AAA') + + def test_hamming_expansion(self): + + b = barcodeFileParser.BarcodeParser() + b.addBarcode( + barcodeFileAlias = 'test', + barcode='AAA', + index='TEST1') + b.addBarcode( + barcodeFileAlias = 'test', + barcode='AAT', + index='TEST2') + b.addBarcode( + barcodeFileAlias = 'test', + barcode='TTT', + index='TEST3') + + b.expand(2,'test') + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('CTC','test') + self.assertEqual(index,'TEST3') + self.assertEqual(barcode,'TTT') + self.assertEqual(hd,2) + + + def test_hamming_expansion_collisions(self): + + b = barcodeFileParser.BarcodeParser() + b.addBarcode( + barcodeFileAlias = 'test', + barcode='AAA', + index='TEST1') + b.addBarcode( + barcodeFileAlias = 'test', + barcode='AAT', + index='TEST2') + b.addBarcode( + barcodeFileAlias = 'test', + barcode='TTT', + index='TEST3') + + b.expand(2,'test') + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('AAG','test') + self.assertIsNone(index) + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('AAG','test') + self.assertIsNone(index) + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('TCA','test') + self.assertIsNone(index) + + + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('AAA','test') + self.assertEqual(index,'TEST1') + self.assertEqual(barcode,'AAA') + self.assertEqual(hd,0) + + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('TAA','test') + self.assertEqual(index,'TEST1') + self.assertEqual(barcode,'AAA') + self.assertEqual(hd,1) + + + def lazy_load_case(self, lazyloadsetting): + b = barcodeFileParser.BarcodeParser(pkg_resources.resource_filename( + 'singlecellmultiomics', + 'modularDemultiplexer/barcodes/'), lazyLoad = lazyloadsetting,hammingDistanceExpansion=1) + + + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('GAATCTCG','celseq1') + self.assertEqual(index,49) + self.assertEqual(barcode,'GAATCTCG') + self.assertEqual(hd,0) + + # Test lazy loading of hamming expansion: + index, barcode, hd = b.getIndexCorrectedBarcodeAndHammingDistance('GTGCTATC','celseq1') + self.assertEqual(index,95) + self.assertEqual(barcode,'GTGCAATC') + self.assertEqual(hd,1) + + + def test_lazy_load(self): + print('lazyLoad all:') + self.lazy_load_case(lazyloadsetting='*') + #print('lazyLoad single:') + #self.lazy_load_case(lazyloadsetting=('celseq1',)) + + +if __name__ == '__main__': + unittest.main()