Skip to content

Commit 417b5e7

Browse files
Version 1.3.9.1
1 parent ade4865 commit 417b5e7

File tree

223 files changed

+3551
-2200
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

223 files changed

+3551
-2200
lines changed

api/api/api.api

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -416,13 +416,13 @@ public abstract interface class gg/essential/api/utils/GuiUtil {
416416
public static final field Companion Lgg/essential/api/utils/GuiUtil$Companion;
417417
public abstract fun getGuiScale ()I
418418
public abstract fun getGuiScale (I)I
419-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
419+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
420420
public static fun getOpenedScreen ()Lnet/minecraft/client/gui/screens/Screen;
421-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
421+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
422422
public static fun open (Lnet/minecraft/client/gui/screens/Screen;)V
423-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
423+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
424424
public abstract fun openScreen (Lnet/minecraft/client/gui/screens/Screen;)V
425-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
425+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
426426
public abstract fun openedScreen ()Lnet/minecraft/client/gui/screens/Screen;
427427
@1.16.2-fabric,1.16.2-forge,1.17.1-fabric,1.18.1-fabric,1.18.2-fabric,1.19-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21.1-fabric,1.21.3-fabric,1.21.4-fabric,1.21.5-fabric,1.21.6-fabric,1.21.7-fabric
428428
public static fun getOpenedScreen ()Lnet/minecraft/client/gui/screen/Screen;
@@ -443,9 +443,9 @@ public abstract interface class gg/essential/api/utils/GuiUtil {
443443
}
444444

445445
public final class gg/essential/api/utils/GuiUtil$Companion {
446-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
446+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
447447
public final fun getOpenedScreen ()Lnet/minecraft/client/gui/screens/Screen;
448-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
448+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
449449
public final fun open (Lnet/minecraft/client/gui/screens/Screen;)V
450450
@1.16.2-fabric,1.16.2-forge,1.17.1-fabric,1.18.1-fabric,1.18.2-fabric,1.19-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21.1-fabric,1.21.3-fabric,1.21.4-fabric,1.21.5-fabric,1.21.6-fabric,1.21.7-fabric
451451
public final fun getOpenedScreen ()Lnet/minecraft/client/gui/screen/Screen;
@@ -511,7 +511,7 @@ public final class gg/essential/api/utils/KotlinAdapter : net/minecraftforge/fml
511511
}
512512

513513
public abstract interface class gg/essential/api/utils/MinecraftUtils {
514-
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge
514+
@1.17.1-forge,1.18.2-forge,1.19.2-forge,1.19.3-forge,1.19.4-forge,1.20.1-forge,1.20.2-forge,1.20.4-forge,1.20.4-neoforge,1.20.6-forge,1.20.6-neoforge,1.21.1-forge,1.21.1-neoforge,1.21.3-forge,1.21.3-neoforge,1.21.4-forge,1.21.4-neoforge,1.21.5-forge,1.21.5-neoforge,1.21.7-forge,1.21.7-neoforge
515515
public abstract fun getResourceImage (Lnet/minecraft/resources/ResourceLocation;)Ljava/awt/image/BufferedImage;
516516
@1.16.2-fabric,1.17.1-fabric,1.18.1-fabric,1.18.2-fabric,1.19-fabric,1.19.2-fabric,1.19.3-fabric,1.19.4-fabric,1.20-fabric,1.20.1-fabric,1.20.2-fabric,1.20.4-fabric,1.20.6-fabric,1.21.1-fabric,1.21.3-fabric,1.21.4-fabric,1.21.5-fabric,1.21.6-fabric,1.21.7-fabric
517517
public abstract fun getResourceImage (Lnet/minecraft/util/Identifier;)Ljava/awt/image/BufferedImage;

build-logic/build.gradle.kts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ dependencies {
3131
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinCompilerVersion")
3232
implementation("org.jetbrains.kotlin:kotlin-serialization:$kotlinCompilerVersion")
3333
implementation("org.jetbrains.dokka:dokka-gradle-plugin:1.8.10")
34-
implementation("org.jetbrains.kotlinx:binary-compatibility-validator:0.13.1")
35-
implementation("io.github.goooler.shadow:shadow-gradle-plugin:8.1.7")
34+
implementation("org.jetbrains.kotlinx:binary-compatibility-validator:0.18.1")
35+
runtimeOnly("org.jetbrains.kotlin:kotlin-metadata-jvm:2.2.0") // for binary-compatibility-validator
36+
implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:8.3.7")
3637
implementation("org.ow2.asm:asm-commons:9.3")
3738
implementation ("com.google.guava:guava:30.1.1-jre")
3839

39-
implementation("gg.essential:essential-gradle-toolkit:0.6.7")
40+
implementation("gg.essential:essential-gradle-toolkit:0.6.10")
4041
implementation("gg.essential.loom:gg.essential.loom.gradle.plugin:1.7.30") // TODO remove once EGT has updated
4142
}
4243

build-logic/src/main/kotlin/essential/preprocessor.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ fun Project.configurePreprocessTree(versions: File) {
2020
configure<RootPreprocessExtension> {
2121
strictExtraMappings.set(true)
2222

23+
val neoForge12107 = createNode("1.21.7-neoforge", 12107, "srg")
24+
val forge12107 = createNode("1.21.7-forge", 12107, "srg")
2325
val fabric12107 = createNode("1.21.7-fabric", 12107, "yarn")
2426
val fabric12106 = createNode("1.21.6-fabric", 12106, "yarn")
2527
val neoForge12105 = createNode("1.21.5-neoforge", 12105, "srg")
@@ -62,6 +64,8 @@ fun Project.configurePreprocessTree(versions: File) {
6264
val forge11202 = createNode("1.12.2-forge", 11202, "srg")
6365
val forge10809 = createNode("1.8.9-forge", 10809, "srg")
6466

67+
neoForge12107.link(fabric12107)
68+
forge12107.link(fabric12107)
6569
fabric12107.link(fabric12106)
6670
fabric12106.link(fabric12105, versions.resolve("1.21.6-1.21.5.txt"))
6771
neoForge12105.link(fabric12105)

build-logic/src/main/kotlin/gg/essential/gradle/RelocatePlugin.kt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ open class RelocatePlugin : Plugin<Project> {
4141
}
4242
}
4343

44-
open class RelocateTask : ShadowJar() {
44+
abstract class RelocateTask : ShadowJar() {
4545
@get:Internal
4646
internal val mappings = mutableMapOf<String, String>()
4747

@@ -115,11 +115,11 @@ private fun Project.createRelocateTask(): TaskProvider<RelocateTask> {
115115
private fun Project.createAbiValidationTasks(relocateTask: TaskProvider<RelocateTask>) {
116116
fun KotlinApiBuildTask.configureAbi() {
117117
// Should maybe move our impl into a dedicated package? (but not before `next` merge)
118-
ignoredClasses += listOf(
118+
ignoredClasses.addAll(listOf(
119119
"gg.essential.Essential",
120120
"gg.essential.DI",
121-
)
122-
ignoredPackages += listOf(
121+
))
122+
ignoredPackages.addAll(listOf(
123123
"gg.essential.asm",
124124
"gg.essential.clipboard",
125125
"gg.essential.commands",
@@ -159,13 +159,13 @@ private fun Project.createAbiValidationTasks(relocateTask: TaskProvider<Relocate
159159
"gg.essential.serverdiscovery",
160160
"gg.essential.upnp",
161161
"gg.essential.forge",
162-
)
162+
))
163163

164164
// These are our internal dependencies as declared in the relocatedJar task and as the name implies, we don't
165165
// care about their public API.
166166
for ((src, dst) in relocateTask.get().mappings) {
167-
ignoredPackages += src
168-
ignoredPackages += dst
167+
ignoredPackages.addAll(src)
168+
ignoredPackages.addAll(dst)
169169
}
170170
}
171171

@@ -175,7 +175,7 @@ private fun Project.createAbiValidationTasks(relocateTask: TaskProvider<Relocate
175175
dependsOn(jarTask)
176176
inputClassesDirs = zipTree(jarTask.archiveFile)
177177
inputDependencies = zipTree(jarTask.archiveFile)
178-
outputApiDir = buildDir.resolve("abiDev")
178+
outputApiFile.set(layout.buildDirectory.file("dev.api"))
179179
}
180180

181181
val relocatedAbiBuild by tasks.registering(KotlinApiBuildTask::class) {
@@ -184,14 +184,14 @@ private fun Project.createAbiValidationTasks(relocateTask: TaskProvider<Relocate
184184
dependsOn(jarTask)
185185
inputClassesDirs = zipTree(jarTask.archiveFile)
186186
inputDependencies = zipTree(jarTask.archiveFile)
187-
outputApiDir = buildDir.resolve("abiRelocated")
187+
outputApiFile.set(layout.buildDirectory.file("relocated.api"))
188188
}
189189

190190
val relocatedAbiCheck by tasks.registering(KotlinApiCompareTask::class) {
191191
dependsOn(devAbiBuild)
192192
dependsOn(relocatedAbiBuild)
193-
projectApiDir = devAbiBuild.get().outputApiDir
194-
apiBuildDir = relocatedAbiBuild.get().outputApiDir
193+
projectApiFile.set(devAbiBuild.get().outputApiFile)
194+
generatedApiFile.set(relocatedAbiBuild.get().outputApiFile)
195195
}
196196
tasks.named("check").configure {
197197
dependsOn(relocatedAbiCheck)

build-logic/src/main/kotlin/gg/essential/gradle/util/KotlinVersion.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ val Platform.kotlinVersion
3838
when {
3939
isModLauncher ->
4040
when (mcVersion) {
41-
12105, 12104, 12103, 12101, 12006, 12004, 12002, 12001, 11904, 11903 -> KotlinVersion.kotlinForForge4
41+
12107, 12105, 12104, 12103, 12101, 12006, 12004, 12002, 12001, 11904, 11903 -> KotlinVersion.kotlinForForge4
4242
11902, 11802 -> KotlinVersion.kotlinForForge3
4343
11701 -> KotlinVersion.kotlinForForge2
4444
11602 -> KotlinVersion.kotlinForForge1

build-logic/src/main/kotlin/gg/essential/gradle/util/SlimKotlinForForgeTransform.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ abstract class SlimKotlinForForgeTransform : TransformAction<TransformParameters
3737
while (true) {
3838
val entry = zipIn.nextEntry ?: break
3939
if (!(entry.name.startsWith("kotlin/") || entry.name.startsWith("kotlinx/")
40+
// Also need to remove Kotlin's service files, latest NeoForge versions will verify
41+
// that the implementation classes exist and fail because we removed them
42+
|| entry.name.startsWith("META-INF/services/kotlin.")
4043
// Also need to delete the coroutines version file, so that lib gets overwritten as well
4144
|| entry.name == "META-INF/kotlinx_coroutines_core.version")) {
4245
zipOut.putNextEntry(entry)

build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import gg.essential.gradle.util.StripKotlinMetadataTransform.Companion.registerS
1616
plugins {
1717
id("kotlin")
1818
id("org.jetbrains.kotlin.plugin.serialization")
19-
id("io.github.goooler.shadow")
2019
id("gg.essential.defaults")
2120
id("gg.essential.defaults.repo")
2221
id("gg.essential.multi-version")
@@ -55,7 +54,7 @@ dependencies {
5554
})
5655
implementation(bundle(project(":kdiscordipc"))!!)
5756

58-
implementation(bundle(project(":cosmetics", configuration = "minecraftRuntimeElements"))!!)
57+
implementation(bundle(project(":cosmetics"))!!)
5958

6059
implementation(bundle(project(":lwjgl3"))!!)
6160
runtimeOnly(bundle(project(":lwjgl3:impl"))!!)
@@ -88,7 +87,7 @@ dependencies {
8887
if (platform.mcVersion >= 12105 && (platform.isFabric || platform.isNeoForge)) {
8988
repositories.modrinth()
9089
if (platform.mcVersion >= 12106) {
91-
modCompileOnly("maven.modrinth:iris:1.9.0+1.21.6-${platform.loaderStr}")
90+
modCompileOnly("maven.modrinth:iris:1.9.1+1.21.7-${platform.loaderStr}")
9291
} else {
9392
modCompileOnly("maven.modrinth:iris:1.8.11+1.21.5-${platform.loaderStr}")
9493
}

changelog/release-1.3.9.1.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
Title: Bug Patch
2+
Summary: Minor bug fixes
3+
4+
## New Versions
5+
- Added support for 1.21.7/8 NeoForge and Forge
6+
7+
## Bug Fixes
8+
- Added Fancy Menu customization support to the Essential Settings button in the Minecraft Options screen
9+
- Fixed Essential Settings button in Minecraft Options screen not supporting animated textures with "Use Minecraft button texture" setting
10+
- Fixed Essential Settings button in Minecraft Options screen not supporting nine-slice textures with "Use Minecraft button texture" setting
11+
- Fixed Essential Settings button in Minecraft Options screen being blurry on Minecraft 1.21.5 and above
12+
- Fixed player in first person emote preview facing the wrong way for some emotes
13+
- Fixed some particles rendering incorrectly on Minecraft 1.16.x and below
14+
- Fixed bad performance with certain particle-heavy cosmetics
15+
- Fixed some cosmetic animations spinning extremely fast in the Inventory screen
16+
- Fixed emotes not pausing correctly when the game is paused during the animation
17+
- Fixed cosmetic idle animations in Wardrobe resetting when switching between cosmetic colors
18+
- Fixed cosmetic visibility not applying when toggled via settings menu
19+
- Fixed player heads (in Social Menu, Account Switcher, Discord Rich Presence, etc.) taking a long time to update
20+
- Fixed player head icons sometimes not loading on old Java versions
21+
- Fixed vertical alignment of compact right sidebar while in Singleplayer
22+
- Fixed the left-side Wardrobe button being unclickable when the player display is moved in certain ways via FancyMenu
23+
- Removed notification for Discord game invite (dysfunctional due to Discord changes)
24+
25+
## Compatibility
26+
- Fixed compatibility with Cumulus' world preview system (requires Cumulus 2.0.7+)
27+
- Fixed capes from Capes Mod not appearing with Essential installed
28+
- Fixed being unable to type in modals with OptiFine installed on Minecraft 1.21.3 and above

elementa/statev2/src/main/kotlin/gg/essential/gui/elementa/state/v2/listCombinators.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ fun <T, U> ListState<T>.mapEach(mapper: (T) -> U): ListState<U> =
128128

129129
// TODO: all of these are based on mapList and as such are quite inefficient, might make sense to implement some as efficient primitives instead
130130

131-
fun <T, U> ListState<T>.mapList(mapper: (List<T>) -> List<U>): ListState<U> =
132-
map(mapper).toListState()
131+
fun <T, U> ListState<T>.mapList(mapper: Observer.(List<T>) -> List<U>): ListState<U> =
132+
State { mapper(this@mapList()) }.toListState()
133133

134134
fun <T, U, V> ListState<T>.zipWithEachElement(otherState: State<U>, transform: (T, U) -> V) =
135135
zip(otherState) { list, other -> list.map { transform(it, other) } }.toListState()
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright (c) 2024 ModCore Inc. All rights reserved.
3+
*
4+
* This code is part of ModCore Inc.'s Essential Mod repository and is protected
5+
* under copyright registration # TX0009138511. For the full license, see:
6+
* https://github.com/EssentialGG/Essential/blob/main/LICENSE
7+
*
8+
* You may not use, copy, reproduce, modify, sell, license, distribute,
9+
* commercialize, or otherwise exploit, or create derivative works based
10+
* upon, this file or any other in this repository, all of which is reserved by Essential.
11+
*/
12+
package gg.essential.gui.elementa.state.v2.collections
13+
14+
import gg.essential.gui.elementa.state.v2.collections.TrackedList.Change
15+
import org.junit.jupiter.api.Test
16+
import kotlin.test.assertEquals
17+
18+
class MutableTrackedListTest {
19+
private infix fun <T> Int.add(value: T): Change<T> =
20+
TrackedList.Add(IndexedValue(this, value))
21+
private infix fun <T> Int.del(value: T): Change<T> =
22+
TrackedList.Remove(IndexedValue(this, value))
23+
private fun <T> clear(vararg oldElements: T): Change<T> =
24+
TrackedList.Clear(oldElements.toList())
25+
26+
@Test
27+
fun testChanges() {
28+
val le = MutableTrackedList<Int>()
29+
assertEquals(listOf(), le.getChangesSince(le).toList())
30+
val l0 = le.add(0)
31+
assertEquals(listOf(0 add 0), l0.getChangesSince(le).toList())
32+
assertEquals(listOf(0 del 0), le.getChangesSince(l0).toList())
33+
assertEquals(listOf(), l0.getChangesSince(l0).toList())
34+
val l1 = l0.add(10)
35+
assertEquals(listOf(), l1.getChangesSince(l1).toList())
36+
assertEquals(listOf(1 add 10), l1.getChangesSince(l0).toList())
37+
assertEquals(listOf(1 del 10), l0.getChangesSince(l1).toList())
38+
val l2 = l1.add(20)
39+
assertEquals(listOf(), l2.getChangesSince(l2).toList())
40+
assertEquals(listOf(2 add 20), l2.getChangesSince(l1).toList())
41+
assertEquals(listOf(2 del 20), l1.getChangesSince(l2).toList())
42+
assertEquals(listOf(1 add 10, 2 add 20), l2.getChangesSince(l0).toList())
43+
assertEquals(listOf(2 del 20, 1 del 10), l0.getChangesSince(l2).toList())
44+
assertEquals(listOf(0 add 0, 1 add 10, 2 add 20), l2.getChangesSince(le).toList())
45+
assertEquals(listOf(2 del 20, 1 del 10, 0 del 0), le.getChangesSince(l2).toList())
46+
}
47+
48+
@Test
49+
fun testUnrelated() {
50+
val a0 = MutableTrackedList<Int>()
51+
val b0 = MutableTrackedList<Int>()
52+
assertEquals(listOf(), a0.getChangesSince(b0).toList())
53+
val a1 = a0.add(10)
54+
val b1 = b0.add(100)
55+
assertEquals(listOf(0 add 10), a1.getChangesSince(b0).toList())
56+
assertEquals(listOf(clear(10)), b0.getChangesSince(a1).toList())
57+
assertEquals(listOf(0 del 100, 0 add 10), a1.getChangesSince(b1).toList())
58+
assertEquals(listOf(0 del 10, 0 add 100), b1.getChangesSince(a1).toList())
59+
}
60+
}

0 commit comments

Comments
 (0)