From ebb5b8a04e36485f5a590dcba851d28f28ab425f Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Thu, 27 Jul 2023 14:00:55 +0200 Subject: [PATCH] network tests: InitializeS2CP See #93 --- .../packets/s2c/play/InitializeS2CPTest.kt | 61 ++++++++++++++++++ .../packets/s2c/play/PacketReadingTestUtil.kt | 3 +- .../packets/initialize/hypixel_1_19_4.bin | Bin 0 -> 30519 bytes .../packets/initialize/vanilla_1_15_2.bin | Bin 0 -> 29 bytes .../packets/initialize/vanilla_1_16_5.bin | Bin 0 -> 30847 bytes .../packets/initialize/vanilla_1_20_1.bin | Bin 0 -> 39288 bytes 6 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CPTest.kt create mode 100644 src/integration-test/resources/packets/initialize/hypixel_1_19_4.bin create mode 100644 src/integration-test/resources/packets/initialize/vanilla_1_15_2.bin create mode 100644 src/integration-test/resources/packets/initialize/vanilla_1_16_5.bin create mode 100644 src/integration-test/resources/packets/initialize/vanilla_1_20_1.bin diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CPTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CPTest.kt new file mode 100644 index 000000000..f6db43af1 --- /dev/null +++ b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/InitializeS2CPTest.kt @@ -0,0 +1,61 @@ +/* + * Minosoft + * Copyright (C) 2020-2023 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.s2c.play + +import de.bixilon.minosoft.data.abilities.Gamemodes +import de.bixilon.minosoft.data.registries.dimension.effects.OverworldEffects +import org.testng.Assert.* +import org.testng.annotations.Test + +@Test(groups = ["packet"]) +class InitializeS2CPTest { + + fun vanilla_1_15_2() { + val packet = PacketReadingTestUtil.read("initialize/vanilla_1_15_2", "1.15.2", constructor = ::InitializeS2CP) + assertEquals(packet.gamemode, Gamemodes.SURVIVAL) + assertEquals(packet.dimension?.effects, OverworldEffects) + assertEquals(packet.entityId, 424) + assertEquals(packet.viewDistance, 9) + } + + fun vanilla_1_16_5() { + val packet = PacketReadingTestUtil.read("initialize/vanilla_1_16_5", "1.16.5", constructor = ::InitializeS2CP) + assertEquals(packet.gamemode, Gamemodes.CREATIVE) + assertEquals(packet.dimension?.effects, OverworldEffects) + assertEquals(packet.entityId, 321) + assertEquals(packet.viewDistance, 8) + assertEquals(packet.registries?.size, 2) + assertTrue(packet.registries!!["minecraft:worldgen/biome"] is Map<*, *>) + } + + fun hypixel_1_19_4() { + val packet = PacketReadingTestUtil.read("initialize/hypixel_1_19_4", "1.19.4", constructor = ::InitializeS2CP) + assertEquals(packet.gamemode, Gamemodes.SURVIVAL) + assertEquals(packet.dimensionName, OverworldEffects.identifier) + assertEquals(packet.entityId, 11659106) + assertNull(packet.lastDeathPosition) + assertEquals(packet.registries?.size, 6) + assertTrue(packet.registries!!["minecraft:worldgen/biome"] is Map<*, *>) + } + + fun vanilla_1_20_1() { + val packet = PacketReadingTestUtil.read("initialize/vanilla_1_20_1", "1.20.1", constructor = ::InitializeS2CP) + assertEquals(packet.gamemode, Gamemodes.CREATIVE) + assertEquals(packet.dimensionName, OverworldEffects.identifier) + assertNull(packet.lastDeathPosition) + assertEquals(packet.registries?.size, 6) + assertTrue(packet.registries!!["minecraft:worldgen/biome"] is Map<*, *>) + } +} + diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/PacketReadingTestUtil.kt b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/PacketReadingTestUtil.kt index 964e0f15f..f5ea2d8c9 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/PacketReadingTestUtil.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/PacketReadingTestUtil.kt @@ -17,11 +17,12 @@ import de.bixilon.minosoft.protocol.network.connection.play.ConnectionTestUtil import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.S2CPacket import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer +import java.io.FileNotFoundException object PacketReadingTestUtil { fun read(name: String, version: String, connection: PlayConnection = ConnectionTestUtil.createConnection(version = version), constructor: (PlayInByteBuffer) -> T): T { - val data = PacketReadingTestUtil::class.java.getResourceAsStream("/packets/$name.bin")!!.readAllBytes() + val data = PacketReadingTestUtil::class.java.getResourceAsStream("/packets/$name.bin")?.readAllBytes() ?: throw FileNotFoundException("Can not find packet blob $name") val buffer = PlayInByteBuffer(data, connection) diff --git a/src/integration-test/resources/packets/initialize/hypixel_1_19_4.bin b/src/integration-test/resources/packets/initialize/hypixel_1_19_4.bin new file mode 100644 index 0000000000000000000000000000000000000000..6297121e27b06efb1d1505870337bc937d52f603 GIT binary patch literal 30519 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 O{PXEcCA_AOvHt^Jcq-8V literal 0 HcmV?d00001 diff --git a/src/integration-test/resources/packets/initialize/vanilla_1_15_2.bin b/src/integration-test/resources/packets/initialize/vanilla_1_15_2.bin new file mode 100644 index 0000000000000000000000000000000000000000..8997e6d8b4d0e67d686f75cc47f7e45b408983dc GIT binary patch literal 29 icmZQzU|hif0*9WZ++~SXQ08DyNli;E%_-qzU<3eVFb6dN literal 0 HcmV?d00001 diff --git a/src/integration-test/resources/packets/initialize/vanilla_1_16_5.bin b/src/integration-test/resources/packets/initialize/vanilla_1_16_5.bin new file mode 100644 index 0000000000000000000000000000000000000000..3572432effe23becdae228dc4e9d35a0b49c34f2 GIT binary patch literal 30847 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 J^*V4O{|A{ErUC!} literal 0 HcmV?d00001 diff --git a/src/integration-test/resources/packets/initialize/vanilla_1_20_1.bin b/src/integration-test/resources/packets/initialize/vanilla_1_20_1.bin new file mode 100644 index 0000000000000000000000000000000000000000..7590d548fccc9e17d88c14eb9598c0c2c649b30c GIT binary patch literal 39288 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 bp0K2-`27q2_k*u*|J`Qe$Prx5jsN~1joPr2 literal 0 HcmV?d00001