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 {
val entity = MC.instance.targetedEntity ?: return@run null
val clipboard = ClipboardUtils.getTextContents()
MC.instance.entit
if (!clipboard.startsWith(EXPORT_WATERMARK)) {
ClipboardUtils.setTextContent(EXPORT_WATERMARK)
} 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()))
println("Copied skull id: $skullTexture")
} else if (it.matches(TConfig.copyItemStack)) {
ClipboardUtils.setTextContent(
ItemStack.CODEC
.encodeStart(MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE), item)
.orThrow.toPrettyString())
val nbt = ItemStack.CODEC
.encodeStart(MC.currentOrDefaultRegistries.getOps(NbtOps.INSTANCE), item)
.orThrow
ClipboardUtils.setTextContent(nbt.toPrettyString())
lastCopiedStack = Pair(item, Text.stringifiedTranslatable("firmament.tooltip.copied.stack"))
}
}

View File

@@ -1,13 +1,23 @@
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.nbt.NbtCompound
import net.minecraft.nbt.NbtElement
import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.NbtString
import net.minecraft.nbt.StringNbtReader
import net.minecraft.registry.RegistryOps
import net.minecraft.text.Text
import net.minecraft.text.TextCodecs
import moe.nea.firmament.features.debug.ExportedTestConstantMeta
import moe.nea.firmament.test.FirmTestBootstrap
import moe.nea.firmament.util.MC
@@ -28,15 +38,45 @@ object ItemResources {
}
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 {
return TextCodecs.CODEC.parse(getNbtOps(), loadSNbt("testdata/chat/$name.snbt"))
.getOrThrow { IllegalStateException("Could not load test chat '$name': $it") }
return TextCodecs.CODEC.parse(
getNbtOps(),
tryMigrateNbt(loadSNbt("testdata/chat/$name.snbt"), TypeReferences.TEXT_COMPONENT)
).getOrThrow { IllegalStateException("Could not load test chat '$name': $it") }
}
fun loadItem(name: String): ItemStack {
// TODO: make the load work with enchantments
// TODO: use DFU to load older items
return ItemStack.CODEC.parse(getNbtOps(), loadSNbt("testdata/items/$name.snbt"))
.getOrThrow { IllegalStateException("Could not load test item '$name': $it") }
try {
val itemNbt = loadSNbt("testdata/items/$name.snbt")
return ItemStack.CODEC.parse(getNbtOps(), tryMigrateNbt(itemNbt, TypeReferences.ITEM_STACK)).orThrow
} catch (ex: Exception) {
throw RuntimeException("Could not load item resource '$name'", ex)
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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