def testAnalyzeIsHorizontalSequence(self): dna = [ "------", "------", "------", "------", "------", "--TTTT"] obj = SimianAnalyzer() self.assertTrue(obj.analyze(dna))
def testAnalyzeFalse(self): dna = [ "------", "------", "------", "------", "------", "------"] obj = SimianAnalyzer() self.assertFalse(obj.analyze(dna))
def testAnalyzeIsVerticalSequence(self): dna = [ "------", "------", "-----T", "-----T", "-----T", "-----T"] obj = SimianAnalyzer() self.assertTrue(obj.analyze(dna))
def testAnalyzeIsInvertedDiagonalSequence(self): dna = [ "------", "------", "-----T", "----T-", "---T--", "--T---"] obj = SimianAnalyzer() self.assertTrue(obj.analyze(dna))
def testIsDiagonalSequence(self): dna = [ "------", "------", "T-----", "-T----", "--T---", "---T--"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 0 self.assertTrue(obj._SimianAnalyzer__isDiagonalSequence(dna))
def testIsVerticalSequenceMultipleRows(self): dna = [ "A-----", "A-----", "A----T", "A----T", "-----T", "-----T"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 1 self.assertTrue(obj._SimianAnalyzer__isVerticalSequence(dna))
def testIsHorizontalSequenceMultipleRows(self): dna = [ "--AAAA", "------", "------", "------", "------", "--TTTT"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 1 self.assertTrue(obj._SimianAnalyzer__isHorizontalSequence(dna))
def testIsInvertedDiagonalSequenceMultipleRows(self): dna = [ "---A--", "--A---", "-A---T", "A---T-", "---T--", "--T---"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 1 self.assertTrue(obj._SimianAnalyzer__isInvertedDiagonalSequence(dna))
def testIsDiagonalSequenceMultipleSplitted(self): dna = [ "T--------", "-T-------", "--T------", "---T-----", "---------", "-----A---", "------A--", "-------A-", "--------A"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 0 self.assertTrue(obj._SimianAnalyzer__isDiagonalSequence(dna))
def testIsVerticalSequenceSkip(self): dna = [ "---------", "---------", "--------T", "--------T", "--------T", "--------T", "--------T", "--------T", "--------T"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 0 self.assertFalse(obj._SimianAnalyzer__isVerticalSequence(dna))
def testIsHorizontalSequenceMultipleSplitted(self): dna = [ "---------", "---------", "---------", "---------", "---------", "---------", "---------", "---------", "TTTT-AAAA"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 0 self.assertTrue(obj._SimianAnalyzer__isHorizontalSequence(dna))
def testIsInvertedDiagonalSequenceSkip(self): dna = [ "---------", "---------", "------T--", "-----T---", "----T----", "---T-----", "--T------", "-T-------", "T--------"] obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 0 self.assertFalse(obj._SimianAnalyzer__isInvertedDiagonalSequence(dna))
class Dna: def __init__(self): self.simian = SimianAnalyzer() self.dna_table = boto3.resource("dynamodb").Table("dna") self.stats_table = boto3.resource("dynamodb").Table("stats") @staticmethod def __generateId(dna: List[str]) -> str: return hashlib.md5("".join(dna).encode("utf-8")).hexdigest() @staticmethod def __calcRatio(simians: int, humans: int) -> Decimal: if not humans: return Decimal(0) return Decimal(simians / humans).quantize(Decimal("1.0")) async def __generateStats(self) -> dict: query = self.dna_table.scan( Select="COUNT", FilterExpression=Attr("is_simian").eq(True)) or {} simians = query.get("Count", 0) humans = query.get("ScannedCount", 0) - simians item = { '_id': "1", 'simians': simians, 'humans': humans, 'ratio': self.__calcRatio(simians, humans) } self.stats_table.put_item(Item=item) return item def store(self, dna: List[str]) -> dict: Validator.check(dna) item = { '_id': self.__generateId(dna), 'dna': dna, 'is_simian': self.isSimian(dna) } self.dna_table.put_item(Item=item) asyncio.run(self.__generateStats()) return item def isSimian(self, dna: List[str]) -> bool: return self.simian.analyze(dna) def stats(self) -> dict: stats = (self.stats_table.scan(Limit=1).get("Items", [{}]) or [{}])[0] return { 'count_mutant_dna': str(stats.get("simians", 0)), 'count_human_dna': str(stats.get("humans", 0)), 'ratio': str(stats.get("ratio", 0)) }
def testGetSequenceByDecrColumns(self): dna = ["CTGAGA", "CTAACC", "TCACGT", "ATACTT", "CCTTGT", "TCTTTT"] row = 0 col = 5 expected = '{}{}{}{}'.format(dna[row][col], dna[row + 1][col - 1], dna[row + 2][col - 2], dna[row + 3][col - 3]) self.assertEqual(expected, SimianAnalyzer._SimianAnalyzer__getSequenceByDecrColumns(dna, row, col))
def testBySizeFalse(self): dna = ["CTGAGA"] self.assertFalse(SimianAnalyzer._SimianAnalyzer__bySize(dna))
def testBySize(self): dna = ["CTGAGA", "CTAACC", "TCACGT", "ATACTT", "CCTTGT", "TCTTTT"] self.assertTrue(SimianAnalyzer._SimianAnalyzer__bySize(dna))
def testAnalyzeFalseBySize(self): dna = ["CTGAGA"] obj = SimianAnalyzer() self.assertFalse(obj.analyze(dna))
def testCheckSequenceFalse(self): obj = SimianAnalyzer() obj._SimianAnalyzer__simian_sequence_found = 10 self.assertFalse(obj.checkSequence())
def __init__(self): self.simian = SimianAnalyzer() self.dna_table = boto3.resource("dynamodb").Table("dna") self.stats_table = boto3.resource("dynamodb").Table("stats")
def testIncrementSimianSequence(self): obj = SimianAnalyzer() self.assertEqual(0, obj._SimianAnalyzer__simian_sequence_found) self.assertEqual(1, obj._SimianAnalyzer__incrementSimianSequence()) self.assertEqual(1, obj._SimianAnalyzer__simian_sequence_found)