1#![warn(clippy::pedantic)]
86#![allow(clippy::must_use_candidate)]
87#![allow(clippy::return_self_not_must_use)]
88#![allow(clippy::module_name_repetitions)]
89#![allow(clippy::into_iter_without_iter)]
91use bitvec::prelude::*;
97
98type Order = Lsb0;
99type Bs = BitSlice<usize, Order>;
100type Bv = BitVec<usize, Order>;
101type Ba<const W: usize> = BitArray<[usize; W], Order>;
102
103pub mod codec;
104pub mod error;
105#[macro_use]
106pub mod kmer;
107pub mod seq;
108
109pub use bio_seq_derive::{dna, iupac};
110
111#[doc(hidden)]
112pub use bitvec::bitarr as __bio_seq_bitarr;
113
114#[doc(hidden)]
115pub use bitvec::prelude::Lsb0 as __bio_seq_Lsb0;
116
117#[cfg(feature = "translation")]
118pub mod translation;
119
120pub mod prelude {
121 pub use crate::codec::amino::Amino;
122 pub use crate::codec::dna::Dna;
123 pub use crate::codec::iupac::Iupac;
124 pub use crate::codec::Codec;
125 pub use crate::{
126 Complement, ComplementMut, Maskable, MaskableMut, Reverse, ReverseComplement,
127 ReverseComplementMut, ReverseMut,
128 };
129
130 pub use crate::kmer::Kmer;
131 pub use crate::seq::{Seq, SeqArray, SeqSlice};
132
133 #[cfg(feature = "translation")]
134 pub use crate::translation;
135
136 pub use core::str::FromStr;
137
138 pub use crate::error::ParseBioError;
139
140 pub use crate::{dna, iupac, kmer};
141
142 #[doc(hidden)]
143 pub use crate::__bio_seq_Lsb0;
144 #[doc(hidden)]
145 pub use crate::__bio_seq_bitarr;
146 #[doc(hidden)]
147 pub use crate::__bio_seq_count_words;
148}
149
150pub trait ComplementMut {
152 fn comp(&mut self);
153}
154
155pub trait Complement: ComplementMut + ToOwned
156where
157 <Self as ToOwned>::Owned: ComplementMut,
158{
159 fn to_comp(&self) -> <Self as ToOwned>::Owned {
164 let mut owned = self.to_owned();
165 owned.comp();
166 owned
167 }
168}
169
170pub trait ReverseMut {
174 fn rev(&mut self);
176}
177
178pub trait Reverse: ReverseMut + ToOwned
179where
180 <Self as ToOwned>::Owned: ReverseMut,
181{
182 fn to_rev(&self) -> <Self as ToOwned>::Owned {
183 let mut owned = self.to_owned();
184 owned.rev();
185 owned
186 }
187}
188
189pub trait ReverseComplementMut: ComplementMut + ReverseMut {
193 fn revcomp(&mut self) {
195 self.comp();
196 self.rev();
197 }
198}
199
200pub trait ReverseComplement: ReverseComplementMut + ToOwned
203where
204 <Self as ToOwned>::Owned: ReverseComplementMut,
205{
206 fn to_revcomp(&self) -> <Self as ToOwned>::Owned {
207 let mut owned = self.to_owned();
208 owned.revcomp();
209 owned
210 }
211}
212
213pub trait MaskableMut {
221 fn mask(&mut self);
222 fn unmask(&mut self);
223}
224
225pub trait Maskable: MaskableMut + ToOwned
226where
227 <Self as ToOwned>::Owned: MaskableMut,
228{
229 fn to_mask(&self) -> <Self as ToOwned>::Owned {
230 let mut owned = self.to_owned();
231 owned.mask();
232 owned
233 }
234 fn to_unmask(&self) -> <Self as ToOwned>::Owned {
235 let mut owned = self.to_owned();
236 owned.unmask();
237 owned
238 }
239}
240
241#[macro_export]
244macro_rules! __bio_seq_count_words {
245 ($len:expr) => {{
246 $len.div_ceil(usize::BITS) as usize
247 }};
248}
249
250#[cfg(test)]
251mod tests {
252 use crate::codec::dna::Dna::{A, C, G, T};
253 use crate::prelude::*;
254 use std::hash::{DefaultHasher, Hash, Hasher};
255
256 #[test]
257 fn alt_repr() {
258 assert_eq!(iupac!("-").nth(0), Iupac::X);
259 }
260
261 #[test]
262 fn into_usize() {
263 let a: usize = dna!("ACGT").to_owned().into_raw()[0];
264 assert_eq!(a, 0b11_10_01_00);
265
266 let b: usize = dna!("CGCG").to_owned().into_raw()[0];
267 assert_eq!(b, 0b10_01_10_01);
268
269 let c: usize = Seq::from(&vec![T, T]).into();
270 assert_eq!(c, 0b11_11);
271
272 let d: usize = Seq::<Dna>::from_str("TCA").unwrap().into();
273 assert_eq!(d, 0b00_01_11);
274
275 let e: usize = Seq::<Dna>::from_str("TGA").unwrap().into();
276 assert_eq!(e, 0b00_10_11);
277
278 let f: usize = Seq::from(&vec![C, G, T, A, C, G, A, T]).into();
279 assert_eq!(f, 0b11_00_10_01_00_11_10_01);
280
281 let g: usize = Seq::from(&vec![A]).into();
282 assert_eq!(g, 0b00);
283 }
284
285 #[test]
286 fn test_display_aminos() {
287 let a: Seq<Amino> = Seq::from_str("DCMNLKG*HI").unwrap();
288 assert_eq!(format!("{a}"), "DCMNLKG*HI");
289 }
290 #[test]
291 fn test_display_dna() {
292 let seq = Seq::from(&vec![A, C, G, T, T, A, T, C]);
293 assert_eq!(format!("{}", &seq), "ACGTTATC");
294 assert_eq!(format!("{}", dna!("ACGT")), "ACGT");
295 }
296
297 #[test]
298 fn iterate_bases() {
299 let seq = dna!("ACGTACGT");
300 assert_eq!(
301 seq.into_iter().collect::<Vec<Dna>>(),
302 vec![A, C, G, T, A, C, G, T]
303 );
304 }
305
306 #[test]
307 fn from_string() {
308 let seq = Seq::<Dna>::from_str("ACGTACGT").unwrap();
309 assert_eq!(
310 seq.into_iter().collect::<Vec<Dna>>(),
311 vec![A, C, G, T, A, C, G, T]
312 );
313 }
314 #[test]
315 fn rev_seq() {
316 let seq = dna!("ACGTACGT");
317 assert_eq!(
318 seq.rev_iter().collect::<Vec<Dna>>(),
319 vec![T, G, C, A, T, G, C, A]
320 );
321 assert_eq!(
322 seq.to_rev().into_iter().collect::<Vec<Dna>>(),
323 vec![T, G, C, A, T, G, C, A]
324 );
325 assert_eq!(
326 iupac!("GN-").rev_iter().collect::<Vec<Iupac>>(),
327 vec![Iupac::X, Iupac::N, Iupac::G]
328 );
329
330 assert_eq!(
331 Seq::<Amino>::try_from("DCMNLKGHI")
332 .unwrap()
333 .to_rev()
334 .into_iter()
335 .collect::<Vec<Amino>>(),
336 vec![
337 Amino::I,
338 Amino::H,
339 Amino::G,
340 Amino::K,
341 Amino::L,
342 Amino::N,
343 Amino::M,
344 Amino::C,
345 Amino::D
346 ]
347 );
348 }
349 #[test]
350 fn iterate_kmers() {
351 let seq = dna!("ACGTAAGGGG");
352 for (kmer, answer) in seq
353 .kmers::<4>()
354 .zip(["ACGT", "CGTA", "GTAA", "TAAG", "AAGG", "AGGG", "GGGG"])
355 {
356 assert_eq!(format!("{}", kmer), answer);
357 }
358 }
359
360 #[test]
361 fn iterate_kmer8() {
362 let seq = dna!("AAAACCCCGGGG");
363 for (kmer, answer) in seq
364 .kmers::<8>()
365 .zip(["AAAACCCC", "AAACCCCG", "AACCCCGG", "ACCCCGGG", "CCCCGGGG"])
366 {
367 assert_eq!(format!("{}", kmer), answer);
368 }
369 }
370
371 #[test]
372 fn iterate_kmer4() {
373 let seq = dna!("AAAACCCCGGGGTTTT");
374 for (kmer, answer) in seq.kmers::<4>().zip([
375 "AAAA", "AAAC", "AACC", "ACCC", "CCCC", "CCCG", "CCGG", "CGGG", "GGGG", "GGGT", "GGTT",
376 "GTTT", "TTTT",
377 ]) {
378 assert_eq!(format!("{}", kmer), answer);
379 }
380 }
381
382 #[test]
383 fn iupac_bitwise_ops() {
384 let s1: &SeqSlice<Iupac> = iupac!("AS-GYTNA");
385 let s2: &SeqSlice<Iupac> = iupac!("ANTGCAT-");
386
387 let s3: &SeqSlice<Iupac> = iupac!("ACGTSWKM");
388 let s4: &SeqSlice<Iupac> = iupac!("WKMSTNNA");
389
390 assert_eq!(s1 | s2, iupac!("ANTGYWNA"));
391 assert_eq!(s3 & s4, iupac!("A----WKA"));
392 }
393 #[test]
394 fn min_sequence() {
395 let seq = dna!("GCTCGATCGTAAAAAATCGTATT");
396
397 let minimised = seq.kmers::<8>().min().unwrap();
398 assert_eq!(minimised, Kmer::try_from(dna!("GTAAAAAA")).unwrap());
399 }
400
401 #[test]
402 fn hash_minimiser() {
403 use core::cmp::min;
404
405 fn hash(seq: &SeqSlice<Dna>) -> u64 {
406 if seq == dna!("GGCTCTCTCTCCTCCA") {
407 0
408 } else {
409 1
410 }
411 }
412
413 let seq =
414 dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCTAAAAAAAAAAAAAAAAGGGGTGTGTGGGTTGTGGAGGAGAGAGAGCC");
415
416 let (minimiser_rc, min_hash_rc) = seq
419 .to_revcomp()
420 .kmers::<16>()
421 .map(|kmer| (kmer, hash(&kmer)))
422 .min_by_key(|&(_, hash)| hash)
423 .unwrap();
424
425 let (minimiser, min_hash) = seq
426 .kmers::<16>()
427 .map(|kmer| (kmer, hash(&kmer)))
428 .min_by_key(|&(_, hash)| hash)
429 .unwrap();
430
431 let (canonical_minimiser, canonical_hash) = seq
434 .kmers::<16>()
435 .map(|kmer| {
436 let canonical_hash = min(hash(&kmer), hash(&kmer.to_revcomp()));
437 (kmer, canonical_hash)
438 })
439 .min_by_key(|&(_, hash)| hash)
440 .unwrap();
441
442 println!("{minimiser_rc} {min_hash_rc}\n{minimiser} {min_hash}\n{canonical_minimiser} {canonical_hash}");
443 assert_eq!(min_hash_rc, canonical_hash);
444 assert_ne!(min_hash, canonical_hash);
445 assert_eq!(minimiser_rc, canonical_minimiser.to_revcomp());
446 }
447
448 #[test]
449 fn hash_characteristics() {
450 fn hash<T: Hash>(chunk: T) -> u64 {
451 let mut hasher = DefaultHasher::new();
452 chunk.hash(&mut hasher);
453 hasher.finish()
454 }
455
456 let s1 = dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCT");
457 let s2 = dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCTA");
458
459 let q1: Seq<Dna> = dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCT").into();
460 let q2: Seq<Dna> = dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCTA").into();
461
462 let s3 = dna!("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
463 let s4 = dna!("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
464
465 let q3 = dna!("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
466 let q4 = dna!("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
467
468 let l3: &SeqSlice<Dna> = &q3;
469 let l3_a: &SeqSlice<Dna> = &q4[1..];
470 let l3_b: &SeqSlice<Dna> = &q4[..32];
471 let l4: &SeqSlice<Dna> = &q4;
472
473 let k1: Kmer<Dna, 32, u64> = s1.try_into().unwrap();
474 let k1_a: Kmer<Dna, 32, u64> = s1.try_into().unwrap();
475
476 let k3: Kmer<Dna, 32, u64> = s3.try_into().unwrap();
477
478 assert_eq!(hash(&l3), hash(q3));
479 assert_eq!(hash(&l3), hash(&l3_a));
480 assert_eq!(hash(&l3_a), hash(&l3_b));
481
482 assert_eq!(hash(&s2), hash(&q2));
483
484 assert_eq!(hash(&s1), hash(s1));
485 assert_eq!(hash(s2), hash(&s2));
486 assert_ne!(hash(&s4), hash(&s3));
487
488 assert_ne!(hash(&l3), hash(&l4));
489 assert_ne!(hash(&l3_a), hash(&l4));
490
491 assert_ne!(hash(&q2), hash(&q1));
492
493 assert_eq!(hash(q3), hash(s3));
494 assert_eq!(hash(s1), hash(&q1));
495 assert_ne!(hash(s3), hash(s4));
496
497 assert_ne!(hash(&k3), hash(&k1));
498 assert_eq!(hash(&k1_a), hash(&k1));
499 assert_eq!(hash(s1), hash(&k1));
500 }
501
502 #[test]
503 fn sequence_type_hashes() {
504 fn hash<T: Hash>(chunk: &T) -> u64 {
505 let mut hasher = DefaultHasher::new();
506 chunk.hash(&mut hasher);
507 hasher.finish()
508 }
509
510 let seq_arr: &SeqSlice<Dna> = dna!("AGCGCTAGTCGTACTGCCGCATCGCTAGCGCT");
511 let seq: Seq<Dna> = seq_arr.into();
512 let seq_slice: &SeqSlice<Dna> = &seq;
513 let kmer: Kmer<Dna, 32, u64> = seq_arr.try_into().unwrap();
514
515 assert_eq!(hash(&seq_arr), hash(&seq));
516 assert_eq!(hash(&seq), hash(&seq_slice));
517 assert_eq!(hash(&seq_slice), hash(&kmer));
518 }
519
520 #[test]
521 fn nth_chars() {
522 assert_eq!(iupac!("ACGTRYSWKMBDHVN-").nth(0), Iupac::A);
523 assert_ne!(iupac!("ACGTRYSWKMBDHVN-").nth(0), Iupac::C);
524 assert_eq!(iupac!("ACGTRYSWKMBDHVN-").nth(15), Iupac::X);
525 assert_eq!(iupac!("ACGTRYSWKMBDHVN-").nth(3), Iupac::from(Dna::T));
526 assert_ne!(iupac!("ACGTRYSWKMBDHVN-").nth(3), Iupac::from(Dna::G));
527
528 assert_eq!(
529 Seq::<Amino>::try_from("DCMNLKGHI").unwrap().nth(1),
530 Amino::C
531 );
532 assert_ne!(
533 Seq::<Amino>::try_from("DCMNLKGHI").unwrap().nth(7),
534 Amino::I
535 );
536 }
537
538 #[test]
539 fn colexicographic_order() {
540 for (i, e) in ["AA", "CA", "GA", "TA", "AC", "CC", "GC", "TC"]
541 .iter()
542 .enumerate()
543 {
544 assert_eq!(format!("{}", Kmer::<Dna, 2>::from(i)), format!("{}", e));
545 assert_eq!(Kmer::<Dna, 2>::from(i), *e);
546 }
547 }
548
549 #[test]
550 fn sequence_type_equality() {
551 let raw_a = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAA";
552 let raw_b = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA";
553 let raw_c = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA";
554 let raw_d = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAAA";
555
556 assert_eq!(raw_a.len(), 63);
557 assert_eq!(raw_b.len(), 64);
558 assert_eq!(raw_d.len(), 65);
559
560 assert_eq!(raw_c, raw_b);
561 assert_eq!(raw_c, &raw_b[..]);
562
563 assert_ne!(raw_b, raw_d);
564 assert_ne!(raw_a, raw_b);
565
566 let seq_a: Seq<Dna> = raw_a.try_into().unwrap();
569 let seq_b: Seq<Dna> = raw_b.try_into().unwrap();
570 let seq_c: Seq<Dna> = raw_c.try_into().unwrap();
571 let seq_d: Seq<Dna> = raw_d.try_into().unwrap();
572
573 assert_eq!(seq_a.len(), raw_a.len());
574 assert_eq!(seq_d.len(), raw_d.len());
575
576 assert_eq!(seq_c, seq_b);
577 assert_eq!(seq_c, &seq_b);
578
579 assert_ne!(seq_a, &seq_b);
580 assert_ne!(seq_a, seq_b);
581 assert_ne!(seq_c, seq_d);
582
583 let slice_a: &SeqSlice<Dna> = &seq_a;
586 let slice_b: &SeqSlice<Dna> = &seq_b;
587 let slice_c: &SeqSlice<Dna> = &seq_c;
588 let slice_d: &SeqSlice<Dna> = &seq_d;
589
590 assert_eq!(slice_a.len(), raw_a.len());
591 assert_eq!(slice_d.len(), raw_d.len());
592
593 assert_eq!(slice_c, slice_b);
594 assert_eq!(slice_c, &slice_b[..]);
595
596 assert_ne!(slice_a, slice_b);
597 assert_ne!(slice_c, slice_d);
598 assert_ne!(slice_c, &slice_d[..]);
599
600 let array_a = dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAA");
603 let array_b = dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA");
604 let array_c: &'static SeqSlice<Dna> =
605 dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA");
606 let array_d: &'static SeqSlice<Dna> =
607 dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAAA");
608
609 assert_eq!(array_a.len(), raw_a.len());
610 assert_eq!(array_d.len(), raw_d.len());
611
612 assert_eq!(array_c, array_b);
613
614 assert_ne!(array_a, array_b);
615 assert_ne!(array_c, array_d);
616
617 let kmer_ax_32: Kmer<Dna, 32, u64> = kmer!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAG", u64);
620 let kmer_bx_32 = Kmer::<Dna, 32, u64>::from_str(&raw_b[..32]).unwrap();
621
622 let kmer_x_32: Kmer<Dna, 32, u64> = kmer!("AATTGTGGGTTCGTCTGCGCCTCCGCCCTTAG", u64);
623
624 assert_eq!(kmer_ax_32.len(), 32);
625
626 assert_eq!(kmer_ax_32, kmer_bx_32);
627 assert_ne!(kmer_ax_32, kmer_x_32);
628
629 let kmer_b_64 = Kmer::<Dna, 64, u128>::from_str(&raw_b).unwrap();
630 let kmer_cx_64 = Kmer::<Dna, 64, u128>::from_str(&raw_d[..64]).unwrap();
631 let kmer_dx_64 = Kmer::<Dna, 64, u128>::from_str(&raw_d[1..]).unwrap();
632
633 assert_eq!(kmer_cx_64.len(), 64);
634
635 assert_eq!(kmer_b_64, kmer_cx_64);
636 assert_ne!(kmer_b_64, kmer_dx_64);
637
638 assert_eq!(seq_c, slice_b);
641 assert_eq!(seq_c, *array_b);
642 assert_eq!(&seq_c, slice_b);
645 assert_eq!(&seq_c, array_b);
646 assert_eq!(slice_c, seq_b);
649 assert_eq!(slice_c, &seq_b);
650 assert_eq!(&slice_c, array_b);
651 assert_eq!(array_c, &seq_b);
654 assert_eq!(array_c, seq_b);
655 assert_eq!(array_c, slice_b);
656 assert_ne!(&seq_a, slice_b);
666 assert_ne!(&seq_a, array_b);
667 assert_ne!(seq_a, slice_b);
668 assert_ne!(seq_a, array_b);
669 assert_ne!(slice_a, &seq_b);
673 assert_ne!(slice_a, seq_b);
674 assert_ne!(&slice_a, array_b);
675 assert_ne!(array_a, &seq_b);
678 assert_ne!(array_a, seq_b);
679 assert_ne!(array_a, slice_b);
680 assert_ne!(seq_d, slice_b);
690 assert_ne!(seq_d, array_b);
691 assert_ne!(&seq_d, slice_b);
693 assert_ne!(&seq_d, array_b);
694 assert_ne!(slice_d, &seq_b);
697 assert_ne!(slice_d, seq_b);
698 assert_ne!(&slice_d, array_b);
699 assert_ne!(array_d, &seq_b);
702 assert_ne!(array_d, seq_b);
703
704 assert_ne!(slice_b, array_d);
705 assert_ne!(array_d, slice_b);
706 }
713}
714
715#[cfg(test)]
716#[cfg(target_arch = "wasm32")]
717mod wasm_tests {
718 use crate::prelude::*;
719 use wasm_bindgen_test::*;
720
721 #[wasm_bindgen_test]
722 fn sequence_type_equality() {
723 let raw_a = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAA";
724 let raw_b = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA";
725 let raw_c = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA";
726 let raw_d = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAAA";
727
728 assert_eq!(raw_a.len(), 63);
729 assert_eq!(raw_b.len(), 64);
730 assert_eq!(raw_d.len(), 65);
731
732 assert_eq!(raw_c, raw_b);
733 assert_eq!(raw_c, &raw_b[..]);
734
735 assert_ne!(raw_b, raw_d);
736 assert_ne!(raw_a, raw_b);
737
738 let seq_a: Seq<Dna> = raw_a.try_into().unwrap();
741 let seq_b: Seq<Dna> = raw_b.try_into().unwrap();
742 let seq_c: Seq<Dna> = raw_c.try_into().unwrap();
743 let seq_d: Seq<Dna> = raw_d.try_into().unwrap();
744
745 assert_eq!(seq_a.len(), raw_a.len());
746 assert_eq!(seq_d.len(), raw_d.len());
747
748 assert_eq!(seq_c, seq_b);
749 assert_eq!(seq_c, &seq_b);
750
751 assert_ne!(seq_a, &seq_b);
752 assert_ne!(seq_a, seq_b);
753 assert_ne!(seq_c, seq_d);
754
755 let slice_a: &SeqSlice<Dna> = &seq_a;
758 let slice_b: &SeqSlice<Dna> = &seq_b;
759 let slice_c: &SeqSlice<Dna> = &seq_c;
760 let slice_d: &SeqSlice<Dna> = &seq_d;
761
762 assert_eq!(slice_a.len(), raw_a.len());
763 assert_eq!(slice_d.len(), raw_d.len());
764
765 assert_eq!(slice_c, slice_b);
766 assert_eq!(slice_c, &slice_b[..]);
767
768 assert_ne!(slice_a, slice_b);
769 assert_ne!(slice_c, slice_d);
770 assert_ne!(slice_c, &slice_d[..]);
771
772 let array_a = dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAA");
775 let array_b = dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA");
776 let array_c: &'static SeqSlice<Dna> =
777 dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA");
778 let array_d: &'static SeqSlice<Dna> =
779 dna!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAAA");
780
781 assert_eq!(array_a.len(), raw_a.len());
782 assert_eq!(array_d.len(), raw_d.len());
783
784 assert_eq!(array_c, array_b);
785
786 assert_ne!(array_a, array_b);
787 assert_ne!(array_c, array_d);
788
789 assert_eq!(seq_c, slice_b);
790 assert_eq!(seq_c, *array_b);
791
792 assert_eq!(&seq_c, slice_b);
793 assert_eq!(&seq_c, array_b);
794
795 assert_eq!(slice_c, seq_b);
796 assert_eq!(slice_c, &seq_b);
797 assert_eq!(&slice_c, array_b);
798
799 assert_eq!(array_c, &seq_b);
800 assert_eq!(array_c, seq_b);
801 assert_eq!(array_c, slice_b);
802 assert_ne!(&seq_a, slice_b);
805 assert_ne!(&seq_a, array_b);
806 assert_ne!(seq_a, slice_b);
807 assert_ne!(seq_a, array_b);
808 assert_ne!(slice_a, &seq_b);
809 assert_ne!(slice_a, seq_b);
810 assert_ne!(&slice_a, array_b);
811
812 assert_ne!(array_a, &seq_b);
813 assert_ne!(array_a, seq_b);
814 assert_ne!(array_a, slice_b);
815 assert_ne!(seq_d, slice_b);
818 assert_ne!(seq_d, array_b);
819 assert_ne!(&seq_d, slice_b);
820 assert_ne!(&seq_d, array_b);
821
822 assert_ne!(slice_d, &seq_b);
823 assert_ne!(slice_d, seq_b);
824 assert_ne!(&slice_d, array_b);
825
826 assert_ne!(array_d, &seq_b);
827 assert_ne!(array_d, seq_b);
828
829 assert_ne!(slice_b, array_d);
830 assert_ne!(array_d, slice_b);
831 }
832
833 #[wasm_bindgen_test]
834 fn wasm_kmers() {
835 let raw_b = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAA";
837 let raw_d = "AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAGTACTATAGGACGATCAGCACCATAAGAACAAAA";
839
840 let kmer_ax_32: Kmer<Dna, 32, u64> = kmer!("AATTGTGGGTTCGTCTGCGGCTCCGCCCTTAG", u64);
841 let kmer_bx_32 = Kmer::<Dna, 32, u64>::from_str(&raw_b[..32]).unwrap();
842
843 let kmer_x_32: Kmer<Dna, 32, u64> = kmer!("AATTGTGGGTTCGTCTGCGCCTCCGCCCTTAG", u64);
844
845 assert_eq!(kmer_ax_32.len(), 32);
846
847 assert_eq!(kmer_ax_32, kmer_bx_32);
848 assert_ne!(kmer_ax_32, kmer_x_32);
849
850 let kmer_b_64 = Kmer::<Dna, 64, u128>::from_str(&raw_b).unwrap();
851 let kmer_cx_64 = Kmer::<Dna, 64, u128>::from_str(&raw_d[..64]).unwrap();
852 let kmer_dx_64 = Kmer::<Dna, 64, u128>::from_str(&raw_d[1..]).unwrap();
853
854 assert_eq!(kmer_cx_64.len(), 64);
855
856 assert_eq!(kmer_b_64, kmer_cx_64);
857 assert_ne!(kmer_b_64, kmer_dx_64);
858 }
859
860 }