File tree Expand file tree Collapse file tree 3 files changed +88
-0
lines changed Expand file tree Collapse file tree 3 files changed +88
-0
lines changed Original file line number Diff line number Diff line change @@ -9,6 +9,12 @@ See [GitHub releases](https://github.com/mll-lab/php-utils/releases).
9
9
10
10
## Unreleased
11
11
12
+ ## v2.2.0
13
+
14
+ ### Added
15
+
16
+ - add ` DnaSequence ` -class
17
+
12
18
## v2.1.0
13
19
14
20
### Added
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments