1
+ package repositories.sceneeditor
2
+
3
+ import PROJECT_1_NAME
4
+ import com.darkrockstudios.apps.hammer.common.data.ProjectDef
5
+ import com.darkrockstudios.apps.hammer.common.data.SceneBuffer
6
+ import com.darkrockstudios.apps.hammer.common.data.SceneContent
7
+ import com.darkrockstudios.apps.hammer.common.data.SceneItem
8
+ import com.darkrockstudios.apps.hammer.common.data.UpdateSource
9
+ import com.darkrockstudios.apps.hammer.common.data.id.IdRepository
10
+ import com.darkrockstudios.apps.hammer.common.data.projectmetadata.ProjectMetadataDatasource
11
+ import com.darkrockstudios.apps.hammer.common.data.projectsync.ClientProjectSynchronizer
12
+ import com.darkrockstudios.apps.hammer.common.data.sceneeditorrepository.SceneDatasource
13
+ import com.darkrockstudios.apps.hammer.common.data.sceneeditorrepository.SceneEditorRepository
14
+ import com.darkrockstudios.apps.hammer.common.data.sceneeditorrepository.SceneEditorRepositoryOkio
15
+ import com.darkrockstudios.apps.hammer.common.data.sceneeditorrepository.scenemetadata.SceneMetadataDatasource
16
+ import com.darkrockstudios.apps.hammer.common.dependencyinjection.createTomlSerializer
17
+ import createProject
18
+ import getProject1Def
19
+ import io.mockk.MockKAnnotations
20
+ import io.mockk.Runs
21
+ import io.mockk.coEvery
22
+ import io.mockk.coVerify
23
+ import io.mockk.impl.annotations.MockK
24
+ import io.mockk.just
25
+ import io.mockk.mockk
26
+ import io.mockk.slot
27
+ import kotlinx.coroutines.cancelAndJoin
28
+ import kotlinx.coroutines.test.advanceUntilIdle
29
+ import kotlinx.coroutines.test.runTest
30
+ import net.peanuuutz.tomlkt.Toml
31
+ import okio.fakefilesystem.FakeFileSystem
32
+ import org.junit.jupiter.api.BeforeEach
33
+ import org.junit.jupiter.api.Test
34
+ import utils.BaseTest
35
+ import kotlin.test.assertEquals
36
+ import kotlin.test.assertFalse
37
+ import kotlin.test.assertTrue
38
+
39
+ class SceneEditorRepositoryBufferTest : BaseTest () {
40
+
41
+ private lateinit var ffs: FakeFileSystem
42
+ private lateinit var toml: Toml
43
+
44
+ @MockK
45
+ private lateinit var projectSynchronizer: ClientProjectSynchronizer
46
+
47
+ @MockK
48
+ private lateinit var idRepository: IdRepository
49
+
50
+ @MockK
51
+ private lateinit var projectMetadataDatasource: ProjectMetadataDatasource
52
+
53
+ private lateinit var sceneMetadataDatasource: SceneMetadataDatasource
54
+ private lateinit var sceneDatasource: SceneDatasource
55
+
56
+ @BeforeEach
57
+ override fun setup () {
58
+ super .setup()
59
+ ffs = FakeFileSystem ()
60
+ toml = createTomlSerializer()
61
+ projectMetadataDatasource = ProjectMetadataDatasource (ffs, toml)
62
+ MockKAnnotations .init (this , relaxUnitFun = true )
63
+ setupKoin()
64
+
65
+ coEvery { projectMetadataDatasource.loadMetadata(any()) } returns mockk(relaxed = true )
66
+ coEvery { projectSynchronizer.isServerSynchronized() } returns false
67
+ coEvery { projectSynchronizer.isEntityDirty(any()) } returns false
68
+ coEvery { projectSynchronizer.markEntityAsDirty(any(), any()) } just Runs
69
+ }
70
+
71
+ private fun createDatasource (projectDef : ProjectDef ): SceneMetadataDatasource {
72
+ return SceneMetadataDatasource (ffs, toml, projectDef)
73
+ }
74
+
75
+ private fun createSceneDatasource (projectDef : ProjectDef ): SceneDatasource {
76
+ return SceneDatasource (projectDef, ffs)
77
+ }
78
+
79
+ private fun createRepository (projectDef : ProjectDef ): SceneEditorRepository {
80
+ sceneMetadataDatasource = createDatasource(projectDef)
81
+ sceneDatasource = createSceneDatasource(projectDef)
82
+ return SceneEditorRepositoryOkio (
83
+ projectDef = projectDef,
84
+ projectSynchronizer = projectSynchronizer,
85
+ fileSystem = ffs,
86
+ idRepository = idRepository,
87
+ projectMetadataDatasource = projectMetadataDatasource,
88
+ sceneMetadataDatasource = sceneMetadataDatasource,
89
+ sceneDatasource = sceneDatasource,
90
+ )
91
+ }
92
+
93
+ @Test
94
+ fun `Subscribe to Buffer Updates` () = runTest(mainTestDispatcher) {
95
+ val projDef = getProject1Def()
96
+ createProject(ffs, PROJECT_1_NAME )
97
+
98
+ val repo = createRepository(projDef)
99
+ repo.initializeSceneEditor()
100
+
101
+ val newContent = SceneContent (
102
+ scene = SceneItem (
103
+ projectDef = getProject1Def(),
104
+ type = SceneItem .Type .Scene ,
105
+ id = 1 ,
106
+ name = " Scene ID 1" ,
107
+ order = 0
108
+ ),
109
+ markdown = " New Content!!"
110
+ )
111
+
112
+ val onBufferUpdate: (suspend (SceneBuffer ) -> Unit ) = mockk()
113
+ val sceneBufferSlot = slot<SceneBuffer >()
114
+ coEvery { onBufferUpdate(capture(sceneBufferSlot)) } just Runs
115
+
116
+ val subJob = repo.subscribeToBufferUpdates(null , scope, onBufferUpdate)
117
+
118
+ repo.onContentChanged(newContent, UpdateSource .Editor )
119
+ advanceUntilIdle()
120
+ subJob.cancelAndJoin()
121
+ coVerify(exactly = 1 ) { onBufferUpdate(any()) }
122
+
123
+ assertTrue(sceneBufferSlot.isCaptured)
124
+ val updated = sceneBufferSlot.captured
125
+ assertEquals(newContent.scene, updated.content.scene)
126
+ assertEquals(UpdateSource .Editor , updated.source)
127
+ assertEquals(newContent.markdown, updated.content.markdown)
128
+ }
129
+
130
+ @Test
131
+ fun `Subscribe to Buffer Updates for one scene` () = runTest(mainTestDispatcher) {
132
+ val projDef = getProject1Def()
133
+ createProject(ffs, PROJECT_1_NAME )
134
+
135
+ val repo = createRepository(projDef)
136
+ repo.initializeSceneEditor()
137
+
138
+ val sceneItem2 = SceneItem (
139
+ projectDef = getProject1Def(),
140
+ type = SceneItem .Type .Scene ,
141
+ id = 3 ,
142
+ name = " Scene ID 3" ,
143
+ order = 0
144
+ )
145
+
146
+ val newContent = SceneContent (
147
+ scene = SceneItem (
148
+ projectDef = getProject1Def(),
149
+ type = SceneItem .Type .Scene ,
150
+ id = 1 ,
151
+ name = " Scene ID 1" ,
152
+ order = 0
153
+ ),
154
+ markdown = " New Content!!"
155
+ )
156
+
157
+ val onBufferUpdate: (suspend (SceneBuffer ) -> Unit ) = mockk()
158
+ coEvery { onBufferUpdate(any()) } just Runs
159
+
160
+ val subJob = repo.subscribeToBufferUpdates(sceneItem2, scope, onBufferUpdate)
161
+ repo.onContentChanged(newContent, UpdateSource .Editor )
162
+ advanceUntilIdle()
163
+ subJob.cancelAndJoin()
164
+ coVerify(exactly = 0 ) { onBufferUpdate(any()) }
165
+ }
166
+
167
+ @Test
168
+ fun `Store Scene Buffer when no buffer is loaded` () = runTest(mainTestDispatcher) {
169
+ val projDef = getProject1Def()
170
+ createProject(ffs, PROJECT_1_NAME )
171
+
172
+ val repo = createRepository(projDef)
173
+ repo.initializeSceneEditor()
174
+
175
+ val sceneItem = SceneItem (
176
+ projectDef = getProject1Def(),
177
+ type = SceneItem .Type .Scene ,
178
+ id = 3 ,
179
+ name = " Scene ID 3" ,
180
+ order = 0
181
+ )
182
+
183
+ val stored = repo.storeSceneBuffer(sceneItem)
184
+ assertFalse(stored)
185
+ }
186
+
187
+ @Test
188
+ fun `Load Scene Buffer, then store it` () = runTest(mainTestDispatcher) {
189
+ val projDef = getProject1Def()
190
+ createProject(ffs, PROJECT_1_NAME )
191
+
192
+ val repo = createRepository(projDef)
193
+ repo.initializeSceneEditor()
194
+
195
+ val sceneItem = SceneItem (
196
+ projectDef = getProject1Def(),
197
+ type = SceneItem .Type .Scene ,
198
+ id = 3 ,
199
+ name = " Scene ID 3" ,
200
+ order = 0
201
+ )
202
+
203
+ val buffer = repo.loadSceneBuffer(sceneItem)
204
+ assertEquals(sceneItem, buffer.content.scene)
205
+ assertEquals(" Content of scene id 3" , buffer.content.markdown)
206
+
207
+ val stored = repo.storeSceneBuffer(sceneItem)
208
+ assertTrue(stored)
209
+ }
210
+ }
0 commit comments