Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare for MPP #785

Closed
wants to merge 6 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions common/api/common.api
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public final class dev/kord/common/Color {
}

public final class dev/kord/common/Color$Companion {
public final fun parseHex (Ljava/lang/String;)Ldev/kord/common/Color;
public final fun serializer ()Lkotlinx/serialization/KSerializer;
}

Expand Down Expand Up @@ -162,6 +163,7 @@ public final class dev/kord/common/Locale$Serializer : kotlinx/serialization/KSe

public final class dev/kord/common/LocaleKt {
public static final fun getKLocale (Ljava/util/Locale;)Ldev/kord/common/Locale;
public static final fun toJavaLocale (Ldev/kord/common/Locale;)Ljava/util/Locale;
}

public abstract interface annotation class dev/kord/common/annotation/DeprecatedSinceKord : java/lang/annotation/Annotation {
Expand Down
2 changes: 2 additions & 0 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ dependencies {
api(libs.kotlinx.serialization.json)
api(libs.kotlinx.datetime)
api(libs.kotlin.logging)
api(libs.ktor.io)
api(libs.bignum)

compileOnly(projects.kspAnnotations)
ksp(projects.kspProcessors)
Expand Down
12 changes: 11 additions & 1 deletion common/src/main/kotlin/Color.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import java.awt.Color as JColor


@Serializable(with = Color.Serializer::class)
Expand Down Expand Up @@ -36,6 +37,15 @@ public class Color(rgb: Int) {
public companion object {
private const val MIN_COLOR = 0
private const val MAX_COLOR = 0xFFFFFF

/**
* Creates a [Color] from a [hex] string.
*/
public fun parseHex(hex: String): Color {
require(hex.startsWith("#")) { "Hex hex needs to start with #" }
val int = hex.drop(1).toInt(16)
return Color(int)
}
}

internal object Serializer : KSerializer<Color> {
Expand All @@ -61,4 +71,4 @@ private fun rgb(red: Int, green: Int, blue: Int): Int {
(blue and 0xFF) shl 0
}

public val java.awt.Color.kColor: Color get() = Color(rgb)
public val JColor.kColor: Color get() = Color(rgb)
14 changes: 8 additions & 6 deletions common/src/main/kotlin/DiscordBitSet.kt
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package dev.kord.common

import com.ionspin.kotlin.bignum.integer.BigInteger
import com.ionspin.kotlin.bignum.integer.Sign
import io.ktor.utils.io.core.*
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import java.math.BigInteger
import java.nio.ByteBuffer
import kotlin.math.max
import kotlin.math.min

Expand All @@ -27,9 +28,10 @@ public class DiscordBitSet(internal var data: LongArray) { // data is in little-
public val value: String
get() {
// need to convert from little-endian data to big-endian expected by BigInteger
val buffer = ByteBuffer.allocate(data.size * Long.SIZE_BYTES)
buffer.asLongBuffer().put(data.reversedArray())
return BigInteger(buffer.array()).toString()
return withBuffer(data.size * Long.SIZE_BYTES) {
writeFully(data.reversedArray())
BigInteger.fromByteArray(readBytes(), Sign.POSITIVE).toString()
}
}

public val size: Int
Expand Down Expand Up @@ -128,7 +130,7 @@ public fun DiscordBitSet(value: String): DiscordBitSet {
return DiscordBitSet(longArrayOf(value.toULong().toLong()))
}

val bytes = BigInteger(value).toByteArray()
val bytes = BigInteger.parseString(value).toByteArray()

val longSize = (bytes.size / Long.SIZE_BYTES) + 1
val destination = LongArray(longSize)
Expand Down
7 changes: 7 additions & 0 deletions common/src/main/kotlin/Locale.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public data class Locale(val language: String, val country: String? = null) {
/**
* Converts this into a [JLocale].
*/
@Deprecated("Moved to extension", ReplaceWith("toJavaLocale()", "dev.kord.common.toJavaLocale"))
public fun asJavaLocale(): JLocale = JLocale(language, country ?: "")

public companion object {
Expand Down Expand Up @@ -253,3 +254,9 @@ public data class Locale(val language: String, val country: String? = null) {
*/
public val JLocale.kLocale: Locale
get() = Locale(language, country.ifBlank { null })

/**
* Converts this into a [JLocale].
*/
public fun Locale.toJavaLocale(): JLocale = JLocale(language, country ?: "")

10 changes: 5 additions & 5 deletions common/src/test/kotlin/BitSetTests.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import dev.kord.common.DiscordBitSet
import dev.kord.common.EmptyBitSet
package dev.kord.common

import kotlin.test.*

class BitSetTests {
Expand Down Expand Up @@ -58,16 +58,16 @@ class BitSetTests {
@Test
fun `get a bit out of range`() {
val a = DiscordBitSet(0b101, 0)
assert(!a[10000])
assertFalse(a[10000])
}

@Test
fun `add and remove a bit`() {
val a = DiscordBitSet(0b101, 0)
a.add(DiscordBitSet(0b111))
assert(a.value == 0b111.toString())
assertEquals(0b111.toString(), a.value)
a.remove(DiscordBitSet(0b001))
assert(a.value == 0b110.toString())
assertEquals(0b110.toString(), a.value)
}

@Test
Expand Down
8 changes: 4 additions & 4 deletions common/src/test/kotlin/ColorTests.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import dev.kord.common.Color
import dev.kord.common.kColor
import org.junit.jupiter.api.Test
package dev.kord.common

import org.junit.jupiter.api.assertThrows
import kotlin.test.Test
import kotlin.test.assertEquals

class ColorTests {
Expand All @@ -26,7 +26,7 @@ class ColorTests {

@Test
fun `java to kColor conversion`() {
val color = java.awt.Color.decode("#DBD0B4").kColor
val color = Color.parseHex("#DBD0B4")

assertEquals(219, color.red)
assertEquals(208, color.green)
Expand Down
2 changes: 2 additions & 0 deletions common/src/test/kotlin/FixedClock.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package dev.kord.common

import kotlinx.datetime.Clock
import kotlinx.datetime.Instant

Expand Down
3 changes: 2 additions & 1 deletion common/src/test/kotlin/LocaleTest.kt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import dev.kord.common.Locale
package dev.kord.common

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
Expand Down
29 changes: 14 additions & 15 deletions common/src/test/kotlin/entity/optional/OptionalBooleanTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,34 +4,35 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import kotlin.test.Test
import kotlin.test.assertFailsWith
import kotlin.test.assertIs
import kotlin.test.assertTrue

internal class OptionalBooleanTest {

@Serializable
private class EmptyOptionalEntity(val value: OptionalBoolean = OptionalBoolean.Missing)

@Test
fun `deserializing nothing in optional assigns Missing`(){
@Language("json")
fun `deserializing nothing in optional assigns Missing`() {
//language=json
val json = """{}"""

val entity = Json.decodeFromString<EmptyOptionalEntity>(json)

assert(entity.value is OptionalBoolean.Missing)
assertIs<OptionalBoolean.Missing>(entity.value)
}

@Serializable
private class NullOptionalEntity(@Suppress("unused") val value: OptionalBoolean = OptionalBoolean.Missing)

@Test
fun `deserializing null in optional throws SerializationException`(){
@Language("json")
fun `deserializing null in optional throws SerializationException`() {
//language=json
val json = """{ "value":null }"""

org.junit.jupiter.api.assertThrows<SerializationException> {
assertFailsWith<SerializationException> {
Json.decodeFromString<NullOptionalEntity>(json)
}
}
Expand All @@ -40,15 +41,13 @@ internal class OptionalBooleanTest {
private class ValueOptionalEntity(@Suppress("unused") val value: OptionalBoolean = OptionalBoolean.Missing)

@Test
fun `deserializing value in optional assigns Value`(){
@Language("json")
fun `deserializing value in optional assigns Value`() {
//language=json
val json = """{ "value":true }"""


val entity = Json.decodeFromString<ValueOptionalEntity>(json)
require(entity.value is OptionalBoolean.Value)

Assertions.assertEquals(true, entity.value.value)
assertIs<OptionalBoolean.Value>(entity.value)
assertTrue(entity.value.value)
}

}
19 changes: 9 additions & 10 deletions common/src/test/kotlin/entity/optional/OptionalIntTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertIs

internal class OptionalIntTest {

Expand All @@ -15,25 +16,24 @@ internal class OptionalIntTest {

@Test
fun `deserializing nothing in optional assigns Missing`(){
@Language("json")
//language=json
val json = """{}"""

val entity = Json.decodeFromString<EmptyOptionalEntity>(json)

assert(entity.value is OptionalInt.Missing)
assertIs<OptionalInt.Missing>(entity.value)
}


@Serializable
private class NullOptionalEntity(@Suppress("unused") val value: OptionalInt = OptionalInt.Missing)

@Test
fun `deserializing null in optional throws SerializationException`(){
@Language("json")
//language=json
val json = """{ "value":null }"""


org.junit.jupiter.api.assertThrows<SerializationException> {
assertFailsWith<SerializationException> {
Json.decodeFromString<NullOptionalEntity>(json)
}
}
Expand All @@ -43,13 +43,12 @@ internal class OptionalIntTest {

@Test
fun `deserializing value in optional assigns Value`(){
@Language("json")
//language=json
val json = """{ "value":5 }"""

val entity = Json.decodeFromString<ValueOptionalEntity>(json)
require(entity.value is OptionalInt.Value)

assertEquals(5, entity.value.value)
}

}
22 changes: 10 additions & 12 deletions common/src/test/kotlin/entity/optional/OptionalLongTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertIs

internal class OptionalLongTest {

Expand All @@ -15,43 +16,40 @@ internal class OptionalLongTest {

@Test
fun `deserializing nothing in optional assigns Missing`() {
@Language("json")
//language=json
val json = """{}"""


val entity = Json.decodeFromString<EmptyOptionalEntity>(json)

assert(entity.value is OptionalLong.Missing)
assertIs<OptionalLong.Missing>(entity.value)
}


@Serializable
class NullOptionalEntity(@Suppress("unused") val value: OptionalLong = OptionalLong.Missing)

@Test
fun `deserializing null in optional throws SerializationException`() {
@Language("json")
//language=json
val json = """{ "value":null }"""


org.junit.jupiter.api.assertThrows<SerializationException> {
assertFailsWith<SerializationException> {
Json.decodeFromString<NullOptionalEntity>(json)
}
}


@Serializable
class ValueOptionalEntity(@Suppress("unused") val value: OptionalLong = OptionalLong.Missing)

@Test
fun `deserializing value in optional assigns Value`() {
@Language("json")
//language=json
val json = """{ "value":5 }"""

val entity = Json.decodeFromString<ValueOptionalEntity>(json)
require(entity.value is OptionalLong.Value)

Assertions.assertEquals(5, entity.value.value)
assertEquals(5, entity.value.value)
}

}
Loading