diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt index cd2fa70c0e6355bd05287fd123d5bb5c037ea29f..690d52e79966f11400129e6d62e76319a1469852 100644 --- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt +++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt @@ -65,15 +65,15 @@ class IrcChannel( } override fun initChanModes(): QVariantMap = mapOf( - "A" to QVariant.of(_A_channelModes.mapValues { (_, value) -> - QVariant.of(value.toList(), Type.QStringList) - }, Type.QVariantMap), - "B" to QVariant.of(_B_channelModes.mapValues { (_, value) -> - QVariant.of(value, Type.QString) - }, Type.QVariantMap), - "C" to QVariant.of(_C_channelModes.mapValues { (_, value) -> - QVariant.of(value, Type.QString) - }, Type.QVariantMap), + "A" to QVariant.of(_A_channelModes.map { (key, value) -> + key.toString() to QVariant.of(value.toList(), Type.QStringList) + }.toMap(), Type.QVariantMap), + "B" to QVariant.of(_B_channelModes.map { (key, value) -> + key.toString() to QVariant.of(value, Type.QString) + }.toMap(), Type.QVariantMap), + "C" to QVariant.of(_C_channelModes.map { (key, value) -> + key.toString() to QVariant.of(value, Type.QString) + }.toMap(), Type.QVariantMap), "D" to QVariant.of(_D_channelModes.joinToString(), Type.QString) ) @@ -89,14 +89,14 @@ class IrcChannel( ) override fun initSetChanModes(chanModes: QVariantMap) { - chanModes["A"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + chanModes["A"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) -> _A_channelModes[key.toCharArray().first()] = variant.valueOr<QStringList>(::emptyList).filterNotNull().toMutableSet() } - chanModes["B"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + chanModes["B"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) -> _B_channelModes[key.toCharArray().first()] = variant.value("") } - chanModes["C"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + chanModes["C"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) -> _C_channelModes[key.toCharArray().first()] = variant.value("") } _D_channelModes = chanModes["D"].value("").toCharArray().toMutableSet() diff --git a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt index 8aad33783eb331b7e21be4dd0a5374e248ffdb36..8d276ac5049fec71b02d12c4c71cf9e95fb22cbc 100644 --- a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt @@ -71,6 +71,79 @@ class NetworkTest { original.setCodecForServer(randomCharset().name()) original.setCodecForEncoding(randomCharset().name()) original.setCodecForDecoding(randomCharset().name()) + original.addSupport("AWAYLEN", "200") + original.addSupport("CALLERID", "g") + original.addSupport("CASEMAPPING", "rfc1459") + original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz") + original.addSupport("CHANNELLEN", "64") + original.addSupport("CHANTYPES", "#") + original.addSupport("CHARSET", "ascii") + original.addSupport("ELIST", "MU") + original.addSupport("ESILENCE", null) + original.addSupport("EXCEPTS", "e") + original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz") + original.addSupport("FNC", null) + original.addSupport("INVEX", "I") + for (i in 0 until randomUByte()) { + original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply { + setUser(randomString()) + setHost(randomString()) + setNick(randomString()) + setRealName(randomString()) + setAccount(randomString()) + setAway(randomBoolean()) + setAwayMessage(randomString()) + setIdleTime(randomInstant()) + setLoginTime(randomInstant()) + setServer(randomString()) + setIrcOperator(randomString()) + setLastAwayMessageTime(randomInstant()) + setWhoisServiceReply(randomString()) + setSuserHost(randomString()) + setEncrypted(randomBoolean()) + setUserModes(listOf( + randomOf(*USERMODES), + randomOf(*USERMODES), + randomOf(*USERMODES) + ).toString()) + } + } + for (i in 0 until randomUByte()) { + original.newIrcChannel(randomString(), mapOf()).apply { + setTopic(randomString()) + setPassword(randomString()) + setEncrypted(randomBoolean()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_B), randomString()) + addChannelMode(randomOf(*CHANMODES_C), randomString()) + addChannelMode(randomOf(*CHANMODES_C), randomString()) + addChannelMode(randomOf(*CHANMODES_D), null) + addChannelMode(randomOf(*CHANMODES_D), null) + addChannelMode(randomOf(*CHANMODES_D), null) + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + } + } val copy = original.copy() copy.fromVariantMap(roundTrip(VariantMapSerializer, original.toVariantMap())) @@ -122,10 +195,105 @@ class NetworkTest { original.setCodecForServer(randomCharset().name()) original.setCodecForEncoding(randomCharset().name()) original.setCodecForDecoding(randomCharset().name()) - original.setAutoAwayActive(randomBoolean()) + original.addSupport("AWAYLEN", "200") + original.addSupport("CALLERID", "g") + original.addSupport("CASEMAPPING", "rfc1459") + original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz") + original.addSupport("CHANNELLEN", "64") + original.addSupport("CHANTYPES", "#") + original.addSupport("CHARSET", "ascii") + original.addSupport("ELIST", "MU") + original.addSupport("ESILENCE", null) + original.addSupport("EXCEPTS", "e") + original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz") + original.addSupport("FNC", null) + original.addSupport("INVEX", "I") + for (i in 0 until randomUByte()) { + original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply { + setUser(randomString()) + setHost(randomString()) + setNick(randomString()) + setRealName(randomString()) + setAccount(randomString()) + setAway(randomBoolean()) + setAwayMessage(randomString()) + setIdleTime(randomInstant()) + setLoginTime(randomInstant()) + setServer(randomString()) + setIrcOperator(randomString()) + setLastAwayMessageTime(randomInstant()) + setWhoisServiceReply(randomString()) + setSuserHost(randomString()) + setEncrypted(randomBoolean()) + setUserModes(listOf( + randomOf(*USERMODES), + randomOf(*USERMODES), + randomOf(*USERMODES) + ).toString()) + } + } + for (i in 0 until randomUByte()) { + original.newIrcChannel(randomString(), mapOf()).apply { + setTopic(randomString()) + setPassword(randomString()) + setEncrypted(randomBoolean()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_A), randomString()) + addChannelMode(randomOf(*CHANMODES_B), randomString()) + addChannelMode(randomOf(*CHANMODES_C), randomString()) + addChannelMode(randomOf(*CHANMODES_C), randomString()) + addChannelMode(randomOf(*CHANMODES_D), null) + addChannelMode(randomOf(*CHANMODES_D), null) + addChannelMode(randomOf(*CHANMODES_D), null) + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + randomOf(original.ircUsers()).let { + joinIrcUser(it) + setUserModes(it, randomOf(*CHANMODES_PREFIX).toString()) + } + } + } val copy = original.copy() copy.fromVariantMap(original.toVariantMap()) assert(original.isEqual(copy)) } + + companion object { + private val USERMODES = arrayOf( + 'B', 'H', 'I', 'L', 'O', 'R', 'S', 'T', 'W', 'c', 'd', 'g', 'h', 'i', 'k', 'o', 'r', 's', 'w', + 'x' + ) + private val CHANMODES_PREFIX = arrayOf( + 'Y', 'o', 'h', 'v' + ) + private val CHANMODES_A = arrayOf( + 'I', 'X', 'Z', 'b', 'e', 'g', 'w' + ) + private val CHANMODES_B = arrayOf( + 'k' + ) + private val CHANMODES_C = arrayOf( + 'F', 'H', 'J', 'L', 'U', 'd', 'f', 'j', 'l', 'x' + ) + private val CHANMODES_D = arrayOf( + 'A', 'B', 'C', 'D', 'K', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'c', 'i', 'm', 'n', 'p', 'r', + 's', 't', 'u', 'z' + ) + } } diff --git a/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt b/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt index ce793447f60735a13dd3d2fd6fad04e77103caa9..3e56347c8ed159609e05d414d29c615d77cd79fe 100644 --- a/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt +++ b/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt @@ -22,6 +22,7 @@ package de.kuschku.libquassel.util import de.kuschku.libquassel.protocol.UByte import de.kuschku.libquassel.protocol.UInt import de.kuschku.libquassel.protocol.UShort +import org.threeten.bp.Instant import java.nio.charset.Charset import java.util.* @@ -42,6 +43,9 @@ fun Any?.randomLong(): Long = random.nextLong() fun Any?.randomString(): String = UUID.randomUUID().toString() +fun Any?.randomInstant(): Instant = Instant.ofEpochMilli(randomLong()) + fun <T> Any?.randomOf(vararg elements: T): T = elements[random.nextInt(elements.size)] +fun <T> Any?.randomOf(elements: List<T>): T = elements[random.nextInt(elements.size)] fun Any?.randomCharset(): Charset = randomOf(*Charset.availableCharsets().values.toTypedArray())