diff --git a/R/XString-class.R b/R/XString-class.R index 5e6333cc..1cb6bc66 100644 --- a/R/XString-class.R +++ b/R/XString-class.R @@ -434,6 +434,13 @@ setMethod("==", signature(e1="BString", e2="character"), setMethod("==", signature(e1="character", e2="BString"), function(e1, e2) e2 == e1 ) +setMethod("==", signature(e1="XString", e2="character"), + ## Coerce to BString to handle things like RNAString("U") == "T" + function(e1, e2) as(e1, "BString") == e2 +) +setMethod("==", signature(e1="character", e2="XString"), + function(e1, e2) e1 == as(e2, "BString") +) setMethod("!=", signature(e1="XString", e2="XString"), function(e1, e2) !(e1 == e2) @@ -444,7 +451,34 @@ setMethod("!=", signature(e1="BString", e2="character"), setMethod("!=", signature(e1="character", e2="BString"), function(e1, e2) !(e1 == e2) ) +setMethod("!=", signature(e1="XString", e2="character"), + function(e1, e2) as(e1, "BString") != e2 +) +setMethod("!=", signature(e1="character", e2="XString"), + function(e1, e2) e1 != as(e2, "BString") +) +### Comparisons are already implemented for XStringSet objects, +### so we can just dispatch to that code here. +setMethod("<=", signature(e1="XString", e2="XString"), + function(e1, e2) + { + if (!comparable_seqtypes(seqtype(e1), seqtype(e2))) { + class1 <- class(e1) + class2 <- class(e2) + stop("comparison between a \"", class1, "\" instance ", + "and a \"", class2, "\" instance ", + "is not supported") + } + as(e1, "XStringSet") <= as(e2, "XStringSet") + } +) +setMethod("<=", signature(e1="XString", e2="character"), + function(e1, e2) as(e1, "BStringSet") <= e2 +) +setMethod("<=", signature(e1="character", e2="XString"), + function(e1, e2) e1 <= as(e2, "BStringSet") +) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### The "substr" and "substring" methods. diff --git a/tests/testthat/test-XString-class.R b/tests/testthat/test-XString-class.R index 6253f758..0d18c2bf 100644 --- a/tests/testthat/test-XString-class.R +++ b/tests/testthat/test-XString-class.R @@ -137,14 +137,64 @@ test_that("equality methods work as advertised", { expect_true(AAString(aastr) != BString(bstr)) expect_true(bstr == BString(bstr)) + ## comparisons against character + expect_true(DNAString("AAA") == "AAA") + expect_true(DNAString("AAA") != "BBB") + expect_false(RNAString("UUU") == "TTT") + expect_true(AAString("UUU") == "UUU") + ## these may seem redundant but need to ensure that order doesn't matter + expect_true("AAA" == DNAString("AAA")) + expect_true("BBB" != DNAString("AAA")) + expect_false("TTT" == RNAString("UUU")) + expect_true("UUU" == AAString("UUU")) + + ## invalid comparisons + expect_error(DNAString() == AAString(), + "comparison between a \"DNAString\" instance and a \"AAString\" instance is not supported") + expect_error(DNAString() == BString(), + "comparison between a \"DNAString\" instance and a \"BString\" instance is not supported") + expect_error(RNAString() == AAString(), + "comparison between a \"RNAString\" instance and a \"AAString\" instance is not supported") + expect_error(RNAString() == BString(), + "comparison between a \"RNAString\" instance and a \"BString\" instance is not supported") +}) + +test_that("inequality methods work as advertised", { + ## Basic cases + expect_true(DNAString("AAA") <= DNAString("AAAA")) + expect_false(DNAString("AAA") > DNAString("AAAA")) + expect_true(DNAString("AAA") <= DNAString("AAA")) + expect_true(DNAString("A") <= DNAString("C")) + expect_false(DNAString("ATTT") > RNAString("AUUU")) + expect_true(AAString("AAA") <= AAString("BBB")) + expect_true(BString("Testing") <= BString("ZZZTesting")) + + ## have to check every combination for XString - character comparisons + ## due to how dispatch works + expect_true(BString("ABCDEFG") <= "ABCDEFG") + expect_true(BString("ABCDEFG") < "ZYXWVUT") + expect_true(BString("ABCDEFG") >= "ABCDEFG") + expect_false(BString("ABCDEFG") > "ABCDEFG") + + expect_true("ABCDEFG" <= BString("ABCDEFG")) + expect_false("ZYXWVUT" < BString("ABCDEFG")) + expect_true("ABCDEFG" >= BString("ABCDEFG")) + expect_false("ABCDEFG" > BString("ABCDEFG")) + + ## Cases with potentially invalid characters + expect_true(DNAString("AAA") < "BBB") + expect_true(DNAString("CCC") > "BBB") + expect_true(RNAString("UUU") >= "TTT") + expect_true(RNAString("UUU") >= "UUU") + ## invalid comparisons - expect_error(DNAString(dnastr) == AAString(aastr), + expect_error(DNAString() <= AAString(), "comparison between a \"DNAString\" instance and a \"AAString\" instance is not supported") - expect_error(DNAString(dnastr) == BString(bstr), + expect_error(DNAString() <= BString(), "comparison between a \"DNAString\" instance and a \"BString\" instance is not supported") - expect_error(RNAString(rnastr) == AAString(aastr), + expect_error(RNAString() <= AAString(), "comparison between a \"RNAString\" instance and a \"AAString\" instance is not supported") - expect_error(RNAString(rnastr) == BString(bstr), + expect_error(RNAString() <= BString(), "comparison between a \"RNAString\" instance and a \"BString\" instance is not supported") })