Skip to content

Commit 4dcbdf6

Browse files
authored
Dna sequence (#24)
* feature: Add Support Illumina NovaSeq Sample Sheets
1 parent 5c83f9e commit 4dcbdf6

File tree

3 files changed

+88
-0
lines changed

3 files changed

+88
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ See [GitHub releases](https://github.com/mll-lab/php-utils/releases).
99

1010
## Unreleased
1111

12+
## v2.2.0
13+
14+
### Added
15+
16+
- add `DnaSequence`-class
17+
1218
## v2.1.0
1319

1420
### Added

src/DnaSequence.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace MLL\Utils;
4+
5+
class DnaSequence
6+
{
7+
protected string $sequence;
8+
9+
public function __construct(string $sequence)
10+
{
11+
if (\Safe\preg_match('/^[ATGC]*$/', $sequence) === 0) {
12+
throw new \InvalidArgumentException('Invalid DNA sequence');
13+
}
14+
$this->sequence = $sequence;
15+
}
16+
17+
public function reverse(): string
18+
{
19+
return implode(array_reverse(mb_str_split($this->sequence)));
20+
}
21+
22+
public function complement(): string
23+
{
24+
return $this->complementSequence($this->sequence);
25+
}
26+
27+
public function reverseComplement(): string
28+
{
29+
return $this->complementSequence($this->reverse());
30+
}
31+
32+
private function complementSequence(string $sequence): string
33+
{
34+
return strtr($sequence, [
35+
'A' => 'T',
36+
'T' => 'A',
37+
'G' => 'C',
38+
'C' => 'G',
39+
]);
40+
}
41+
}

tests/DnaSequenceTest.php

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace MLL\Utils\Tests;
4+
5+
use MLL\Utils\DnaSequence;
6+
use PHPUnit\Framework\TestCase;
7+
8+
class DnaSequenceTest extends TestCase
9+
{
10+
public function testReverse(): void
11+
{
12+
$dnaSequence = new DnaSequence('ATGC');
13+
self::assertEquals('CGTA', $dnaSequence->reverse());
14+
}
15+
16+
public function testComplement(): void
17+
{
18+
$dnaSequence = new DnaSequence('ATGC');
19+
self::assertEquals('TACG', $dnaSequence->complement());
20+
}
21+
22+
public function testReverseComplement(): void
23+
{
24+
$dnaSequence = new DnaSequence('ATGC');
25+
self::assertEquals('GCAT', $dnaSequence->reverseComplement());
26+
}
27+
28+
public function testInvalidSequenceThrowsException(): void
29+
{
30+
$this->expectException(\InvalidArgumentException::class);
31+
new DnaSequence('INVALID');
32+
}
33+
34+
public function testEmptySequence(): void
35+
{
36+
$dnaSequence = new DnaSequence('');
37+
self::assertEquals('', $dnaSequence->reverse());
38+
self::assertEquals('', $dnaSequence->complement());
39+
self::assertEquals('', $dnaSequence->reverseComplement());
40+
}
41+
}

0 commit comments

Comments
 (0)