fix(test): Unit Tests not DFUing items

This commit is contained in:
Linnea Gräf
2025-05-05 15:33:21 +02:00
parent 0a5a108b15
commit 38fd61fdcc
19 changed files with 114 additions and 11 deletions

View File

@@ -81,7 +81,6 @@ object AnimatedClothingScanner {
if (subject == null) run { if (subject == null) run {
val entity = MC.instance.targetedEntity ?: return@run null val entity = MC.instance.targetedEntity ?: return@run null
val clipboard = ClipboardUtils.getTextContents() val clipboard = ClipboardUtils.getTextContents()
MC.instance.entit
if (!clipboard.startsWith(EXPORT_WATERMARK)) { if (!clipboard.startsWith(EXPORT_WATERMARK)) {
ClipboardUtils.setTextContent(EXPORT_WATERMARK) ClipboardUtils.setTextContent(EXPORT_WATERMARK)
} else { } else {

View File

@@ -0,0 +1,19 @@
package moe.nea.firmament.features.debug
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import java.util.Optional
data class ExportedTestConstantMeta(
val dataVersion: Int,
val modVersion: Optional<String>,
) {
companion object {
val CODEC: Codec<ExportedTestConstantMeta> = RecordCodecBuilder.create {
it.group(
Codec.INT.fieldOf("dataVersion").forGetter(ExportedTestConstantMeta::dataVersion),
Codec.STRING.optionalFieldOf("modVersion").forGetter(ExportedTestConstantMeta::modVersion),
).apply(it, ::ExportedTestConstantMeta)
}
}
}

View File

@@ -180,10 +180,10 @@ object PowerUserTools : FirmamentFeature {
Pair(item, Text.stringifiedTranslatable("firmament.tooltip.copied.skull-id", skullTexture.toString())) Pair(item, Text.stringifiedTranslatable("firmament.tooltip.copied.skull-id", skullTexture.toString()))
println("Copied skull id: $skullTexture") println("Copied skull id: $skullTexture")
} else if (it.matches(TConfig.copyItemStack)) { } else if (it.matches(TConfig.copyItemStack)) {
ClipboardUtils.setTextContent( val nbt = ItemStack.CODEC
ItemStack.CODEC .encodeStart(MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE), item)
.encodeStart(MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE), item) .orThrow
.orThrow.toPrettyString()) ClipboardUtils.setTextContent(nbt.toPrettyString())
lastCopiedStack = Pair(item, Text.stringifiedTranslatable("firmament.tooltip.copied.stack")) lastCopiedStack = Pair(item, Text.stringifiedTranslatable("firmament.tooltip.copied.stack"))
} }
} }

View File

@@ -1,13 +1,23 @@
package moe.nea.firmament.test.testutil package moe.nea.firmament.test.testutil
import com.mojang.datafixers.DSL
import com.mojang.datafixers.DataFixUtils
import com.mojang.datafixers.types.templates.Named
import com.mojang.serialization.Dynamic
import com.mojang.serialization.JsonOps
import net.minecraft.SharedConstants
import net.minecraft.datafixer.Schemas
import net.minecraft.datafixer.TypeReferences
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtCompound
import net.minecraft.nbt.NbtElement import net.minecraft.nbt.NbtElement
import net.minecraft.nbt.NbtOps import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.NbtString
import net.minecraft.nbt.StringNbtReader import net.minecraft.nbt.StringNbtReader
import net.minecraft.registry.RegistryOps import net.minecraft.registry.RegistryOps
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.text.TextCodecs import net.minecraft.text.TextCodecs
import moe.nea.firmament.features.debug.ExportedTestConstantMeta
import moe.nea.firmament.test.FirmTestBootstrap import moe.nea.firmament.test.FirmTestBootstrap
import moe.nea.firmament.util.MC import moe.nea.firmament.util.MC
@@ -28,15 +38,45 @@ object ItemResources {
} }
fun getNbtOps(): RegistryOps<NbtElement> = MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE) fun getNbtOps(): RegistryOps<NbtElement> = MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE)
fun tryMigrateNbt(
nbtCompound: NbtCompound,
typ: DSL.TypeReference,
): NbtElement {
val source = nbtCompound.get("source", ExportedTestConstantMeta.CODEC)
nbtCompound.remove("source")
if (source.isPresent) {
val wrappedNbtSource = if (typ == TypeReferences.TEXT_COMPONENT && source.get().dataVersion < 4325) {
// Per 1.21.5 text components are wrapped in a string, which firmament unwrapped in the snbt files
NbtString.of(
NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, nbtCompound)
.toString())
} else {
nbtCompound
}
return Schemas.getFixer()
.update(
typ,
Dynamic(NbtOps.INSTANCE, wrappedNbtSource),
source.get().dataVersion,
SharedConstants.getGameVersion().saveVersion.id
).value
}
return nbtCompound
}
fun loadText(name: String): Text { fun loadText(name: String): Text {
return TextCodecs.CODEC.parse(getNbtOps(), loadSNbt("testdata/chat/$name.snbt")) return TextCodecs.CODEC.parse(
.getOrThrow { IllegalStateException("Could not load test chat '$name': $it") } getNbtOps(),
tryMigrateNbt(loadSNbt("testdata/chat/$name.snbt"), TypeReferences.TEXT_COMPONENT)
).getOrThrow { IllegalStateException("Could not load test chat '$name': $it") }
} }
fun loadItem(name: String): ItemStack { fun loadItem(name: String): ItemStack {
// TODO: make the load work with enchantments try {
// TODO: use DFU to load older items val itemNbt = loadSNbt("testdata/items/$name.snbt")
return ItemStack.CODEC.parse(getNbtOps(), loadSNbt("testdata/items/$name.snbt")) return ItemStack.CODEC.parse(getNbtOps(), tryMigrateNbt(itemNbt, TypeReferences.ITEM_STACK)).orThrow
.getOrThrow { IllegalStateException("Could not load test item '$name': $it") } } catch (ex: Exception) {
throw RuntimeException("Could not load item resource '$name'", ex)
}
} }
} }

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
extra: [ extra: [
{ {
bold: 0b, bold: 0b,

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
color: "#FFAA00", color: "#FFAA00",
extra: [ extra: [
{ {

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
color: "#FFAA00", color: "#FFAA00",
extra: [ extra: [
{ {

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:custom_data": { "minecraft:custom_data": {
id: "PET", id: "PET",

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:custom_data": { "minecraft:custom_data": {
id: "PET", id: "PET",

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:custom_data": { "minecraft:custom_data": {
}, },

View File

@@ -1,4 +1,7 @@
{ {
source: {
dataVersion: 4189,
},
components: { components: {
"minecraft:attribute_modifiers": { "minecraft:attribute_modifiers": {
modifiers: [ modifiers: [