diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemBuilder.kt index 9b1acc6e..cc049072 100644 --- a/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemBuilder.kt +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemBuilder.kt @@ -11,8 +11,8 @@ import android.content.Entity import at.bitfire.synctools.icalendar.AssociatedComponents import at.bitfire.synctools.mapping.jtx.builder.CollectionIdBuilder import at.bitfire.synctools.mapping.jtx.builder.DescriptionBuilder -import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder import at.bitfire.synctools.mapping.jtx.builder.JtxEntityBuilder +import at.bitfire.synctools.mapping.jtx.builder.RecurrenceFieldsBuilder import at.bitfire.synctools.mapping.jtx.builder.SyncPropertiesBuilder import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions import net.fortuna.ical4j.model.component.CalendarComponent diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/builder/JtxEntityBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/builder/JtxEntityBuilder.kt index 7585198c..4415d22a 100644 --- a/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/builder/JtxEntityBuilder.kt +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/jtx/builder/JtxEntityBuilder.kt @@ -7,10 +7,10 @@ package at.bitfire.synctools.mapping.jtx.builder import android.content.Entity +import at.bitfire.synctools.exception.InvalidICalendarException import net.fortuna.ical4j.model.component.CalendarComponent import net.fortuna.ical4j.model.component.VJournal import net.fortuna.ical4j.model.component.VToDo -import at.bitfire.synctools.exception.InvalidICalendarException interface JtxEntityBuilder { diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt index 42b9b577..0aaaa61d 100644 --- a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/DmfsTaskBuilder.kt @@ -11,7 +11,9 @@ import android.content.Entity import at.bitfire.ical4android.Task import at.bitfire.ical4android.UnknownProperty import at.bitfire.synctools.mapping.tasks.builder.AllDayBuilder +import at.bitfire.synctools.mapping.tasks.builder.ClassificationBuilder import at.bitfire.synctools.mapping.tasks.builder.ColorBuilder +import at.bitfire.synctools.mapping.tasks.builder.CompletedBuilder import at.bitfire.synctools.mapping.tasks.builder.DescriptionBuilder import at.bitfire.synctools.mapping.tasks.builder.DirtyBuilder import at.bitfire.synctools.mapping.tasks.builder.DmfsTaskFieldBuilder @@ -21,9 +23,12 @@ import at.bitfire.synctools.mapping.tasks.builder.ETagBuilder import at.bitfire.synctools.mapping.tasks.builder.GeoBuilder import at.bitfire.synctools.mapping.tasks.builder.LocationBuilder import at.bitfire.synctools.mapping.tasks.builder.OrganizerBuilder +import at.bitfire.synctools.mapping.tasks.builder.PercentCompleteBuilder +import at.bitfire.synctools.mapping.tasks.builder.PriorityBuilder import at.bitfire.synctools.mapping.tasks.builder.RecurrenceFieldsBuilder import at.bitfire.synctools.mapping.tasks.builder.SequenceBuilder import at.bitfire.synctools.mapping.tasks.builder.StartTimeBuilder +import at.bitfire.synctools.mapping.tasks.builder.StatusBuilder import at.bitfire.synctools.mapping.tasks.builder.SyncFlagsBuilder import at.bitfire.synctools.mapping.tasks.builder.SyncIdBuilder import at.bitfire.synctools.mapping.tasks.builder.TitleBuilder @@ -40,8 +45,6 @@ import net.fortuna.ical4j.model.parameter.RelType import net.fortuna.ical4j.model.parameter.Related import net.fortuna.ical4j.model.property.Action import net.fortuna.ical4j.model.property.immutable.ImmutableAction -import net.fortuna.ical4j.model.property.immutable.ImmutableClazz -import net.fortuna.ical4j.model.property.immutable.ImmutableStatus import org.dmfs.tasks.contract.TaskContract.Properties import org.dmfs.tasks.contract.TaskContract.Property.Alarm import org.dmfs.tasks.contract.TaskContract.Property.Category @@ -76,6 +79,12 @@ class DmfsTaskBuilder( SyncFlagsBuilder(flags), SequenceBuilder(), DirtyBuilder(), + // status fields + PriorityBuilder(), + ClassificationBuilder(), + StatusBuilder(), + CompletedBuilder(), + PercentCompleteBuilder(), // content fields TitleBuilder(), DescriptionBuilder(), @@ -90,7 +99,6 @@ class DmfsTaskBuilder( DueBuilder(), DurationBuilder(), RecurrenceFieldsBuilder(), - // status (still inline below) // property sub-rows (still inline below via insertProperties) ) @@ -128,30 +136,6 @@ class DmfsTaskBuilder( // parent_id will be re-calculated when the relation row is inserted (if there is any) .withValue(Tasks.PARENT_ID, null) - // Priority, classification - builder - .withValue(Tasks.PRIORITY, task.priority) - .withValue(Tasks.CLASSIFICATION, when (task.classification?.value?.uppercase()) { - ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC - ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL - null -> Tasks.CLASSIFICATION_DEFAULT - else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE - }) - - // COMPLETED must always be a DATE-TIME - builder - .withValue(Tasks.COMPLETED, task.completedAt?.date?.toEpochMilli()) - .withValue(Tasks.COMPLETED_IS_ALLDAY, 0) - .withValue(Tasks.PERCENT_COMPLETE, task.percentComplete) - - // Status - val status = when (task.status?.value) { - ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS - ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED - ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED - else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION - } - builder.withValue(Tasks.STATUS, status) builder .withValue(Tasks.CREATED, task.createdAt) .withValue(Tasks.LAST_MODIFIED, task.lastModified) diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilder.kt new file mode 100644 index 00000000..fd32c6ef --- /dev/null +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilder.kt @@ -0,0 +1,25 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.Entity +import at.bitfire.ical4android.Task +import net.fortuna.ical4j.model.property.immutable.ImmutableClazz +import org.dmfs.tasks.contract.TaskContract.Tasks + +class ClassificationBuilder : DmfsTaskFieldBuilder { + + override fun build(from: Task, to: Entity) { + to.entityValues.put(Tasks.CLASSIFICATION, when (from.classification?.value?.uppercase()) { + ImmutableClazz.VALUE_PUBLIC -> Tasks.CLASSIFICATION_PUBLIC + ImmutableClazz.VALUE_CONFIDENTIAL -> Tasks.CLASSIFICATION_CONFIDENTIAL + null -> Tasks.CLASSIFICATION_DEFAULT + else -> Tasks.CLASSIFICATION_PRIVATE // all unknown classifications MUST be treated as PRIVATE + }) + } + +} diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilder.kt new file mode 100644 index 00000000..b8f6578e --- /dev/null +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilder.kt @@ -0,0 +1,21 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.Entity +import at.bitfire.ical4android.Task +import org.dmfs.tasks.contract.TaskContract.Tasks + +class CompletedBuilder : DmfsTaskFieldBuilder { + + override fun build(from: Task, to: Entity) { + // COMPLETED must always be a DATE-TIME + to.entityValues.put(Tasks.COMPLETED, from.completedAt?.date?.toEpochMilli()) + to.entityValues.put(Tasks.COMPLETED_IS_ALLDAY, 0) + } + +} diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilder.kt new file mode 100644 index 00000000..1841a3a1 --- /dev/null +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilder.kt @@ -0,0 +1,19 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.Entity +import at.bitfire.ical4android.Task +import org.dmfs.tasks.contract.TaskContract.Tasks + +class PercentCompleteBuilder : DmfsTaskFieldBuilder { + + override fun build(from: Task, to: Entity) { + to.entityValues.put(Tasks.PERCENT_COMPLETE, from.percentComplete) + } + +} diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilder.kt new file mode 100644 index 00000000..6b6e593e --- /dev/null +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilder.kt @@ -0,0 +1,19 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.Entity +import at.bitfire.ical4android.Task +import org.dmfs.tasks.contract.TaskContract.Tasks + +class PriorityBuilder : DmfsTaskFieldBuilder { + + override fun build(from: Task, to: Entity) { + to.entityValues.put(Tasks.PRIORITY, from.priority) + } + +} diff --git a/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilder.kt b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilder.kt new file mode 100644 index 00000000..a7cff4ea --- /dev/null +++ b/lib/src/main/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilder.kt @@ -0,0 +1,25 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.Entity +import at.bitfire.ical4android.Task +import net.fortuna.ical4j.model.property.immutable.ImmutableStatus +import org.dmfs.tasks.contract.TaskContract.Tasks + +class StatusBuilder : DmfsTaskFieldBuilder { + + override fun build(from: Task, to: Entity) { + to.entityValues.put(Tasks.STATUS, when (from.status?.value) { + ImmutableStatus.VALUE_IN_PROCESS -> Tasks.STATUS_IN_PROCESS + ImmutableStatus.VALUE_COMPLETED -> Tasks.STATUS_COMPLETED + ImmutableStatus.VALUE_CANCELLED -> Tasks.STATUS_CANCELLED + else -> Tasks.STATUS_DEFAULT // == Tasks.STATUS_NEEDS_ACTION + }) + } + +} diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemHandlerTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemHandlerTest.kt index ce4f832a..029ba813 100644 --- a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemHandlerTest.kt +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/JtxItemHandlerTest.kt @@ -8,20 +8,18 @@ package at.bitfire.synctools.mapping.jtx import android.content.Entity import androidx.core.content.contentValuesOf -import net.fortuna.ical4j.model.property.ProdId -import org.junit.Test -import org.junit.runner.RunWith -import org.robolectric.RobolectricTestRunner - import at.bitfire.synctools.storage.jtx.JtxItemAndExceptions import at.techbee.jtx.JtxContract import net.fortuna.ical4j.model.component.VJournal import net.fortuna.ical4j.model.component.VToDo +import net.fortuna.ical4j.model.property.ProdId import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue -import kotlin.jvm.optionals.getOrNull +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class JtxItemHandlerTest { diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/DirtyAndDeletedBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/DirtyAndDeletedBuilderTest.kt index bab669f7..c9c782be 100644 --- a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/DirtyAndDeletedBuilderTest.kt +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/DirtyAndDeletedBuilderTest.kt @@ -10,7 +10,7 @@ import android.content.ContentValues import android.content.Entity import at.techbee.jtx.JtxContract import net.fortuna.ical4j.model.component.VJournal -import org.junit.Assert.* +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/RecurrenceFieldsBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/RecurrenceFieldsBuilderTest.kt index 9621236b..0d3cf398 100644 --- a/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/RecurrenceFieldsBuilderTest.kt +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/jtx/builder/RecurrenceFieldsBuilderTest.kt @@ -15,7 +15,6 @@ import at.bitfire.synctools.icalendar.plusAssign import at.bitfire.synctools.test.assertContentValuesEqual import at.techbee.jtx.JtxContract import net.fortuna.ical4j.model.DateList -import net.fortuna.ical4j.model.ParameterList import net.fortuna.ical4j.model.Period import net.fortuna.ical4j.model.TimeZoneRegistryFactory import net.fortuna.ical4j.model.component.VToDo diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilderTest.kt new file mode 100644 index 00000000..0966c264 --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/ClassificationBuilderTest.kt @@ -0,0 +1,86 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.ContentValues +import android.content.Entity +import androidx.core.content.contentValuesOf +import at.bitfire.ical4android.Task +import at.bitfire.synctools.test.assertContentValuesEqual +import net.fortuna.ical4j.model.property.Clazz +import net.fortuna.ical4j.model.property.immutable.ImmutableClazz +import org.dmfs.tasks.contract.TaskContract.Tasks +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class ClassificationBuilderTest { + + private val builder = ClassificationBuilder() + + @Test + fun `No CLASS defaults to DEFAULT`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_DEFAULT + ), result.entityValues) + } + + @Test + fun `CLASS is PUBLIC`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(classification = Clazz(ImmutableClazz.VALUE_PUBLIC)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PUBLIC + ), result.entityValues) + } + + @Test + fun `CLASS is PRIVATE`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(classification = Clazz(ImmutableClazz.VALUE_PRIVATE)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PRIVATE + ), result.entityValues) + } + + @Test + fun `CLASS is CONFIDENTIAL`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(classification = Clazz(ImmutableClazz.VALUE_CONFIDENTIAL)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_CONFIDENTIAL + ), result.entityValues) + } + + @Test + fun `Unknown CLASS maps to PRIVATE`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(classification = Clazz("X-CUSTOM")), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.CLASSIFICATION to Tasks.CLASSIFICATION_PRIVATE + ), result.entityValues) + } + +} diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilderTest.kt new file mode 100644 index 00000000..8c73802b --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/CompletedBuilderTest.kt @@ -0,0 +1,53 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.ContentValues +import android.content.Entity +import androidx.core.content.contentValuesOf +import at.bitfire.ical4android.Task +import at.bitfire.synctools.test.assertContentValuesEqual +import net.fortuna.ical4j.model.property.Completed +import org.dmfs.tasks.contract.TaskContract.Tasks +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner +import java.time.Instant + +@RunWith(RobolectricTestRunner::class) +class CompletedBuilderTest { + + private val builder = CompletedBuilder() + + @Test + fun `No COMPLETED`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.COMPLETED to null, + Tasks.COMPLETED_IS_ALLDAY to 0 + ), result.entityValues) + } + + @Test + fun `COMPLETED is set`() { + val instant = Instant.ofEpochMilli(1_000_000L) + val result = Entity(ContentValues()) + builder.build( + from = Task(completedAt = Completed(instant)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.COMPLETED to 1_000_000L, + Tasks.COMPLETED_IS_ALLDAY to 0 + ), result.entityValues) + } + +} diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilderTest.kt new file mode 100644 index 00000000..2a17e317 --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PercentCompleteBuilderTest.kt @@ -0,0 +1,60 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.ContentValues +import android.content.Entity +import androidx.core.content.contentValuesOf +import at.bitfire.ical4android.Task +import at.bitfire.synctools.test.assertContentValuesEqual +import org.dmfs.tasks.contract.TaskContract.Tasks +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class PercentCompleteBuilderTest { + + private val builder = PercentCompleteBuilder() + + @Test + fun `No PERCENT-COMPLETE`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.PERCENT_COMPLETE to null + ), result.entityValues) + } + + @Test + fun `PERCENT-COMPLETE is 50`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(percentComplete = 50), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.PERCENT_COMPLETE to 50 + ), result.entityValues) + } + + @Test + fun `PERCENT-COMPLETE is 100`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(percentComplete = 100), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.PERCENT_COMPLETE to 100 + ), result.entityValues) + } + +} diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilderTest.kt new file mode 100644 index 00000000..475bd1fd --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/PriorityBuilderTest.kt @@ -0,0 +1,48 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.ContentValues +import android.content.Entity +import androidx.core.content.contentValuesOf +import at.bitfire.ical4android.Task +import at.bitfire.synctools.test.assertContentValuesEqual +import org.dmfs.tasks.contract.TaskContract.Tasks +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class PriorityBuilderTest { + + private val builder = PriorityBuilder() + + @Test + fun `No PRIORITY`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.PRIORITY to 0 + ), result.entityValues) + } + + @Test + fun `PRIORITY is 5`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(priority = 5), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.PRIORITY to 5 + ), result.entityValues) + } + +} diff --git a/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilderTest.kt b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilderTest.kt new file mode 100644 index 00000000..2ecc50e2 --- /dev/null +++ b/lib/src/test/kotlin/at/bitfire/synctools/mapping/tasks/builder/StatusBuilderTest.kt @@ -0,0 +1,86 @@ +/* + * This file is part of bitfireAT/synctools which is released under GPLv3. + * Copyright © All Contributors. See the LICENSE and AUTHOR files in the root directory for details. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package at.bitfire.synctools.mapping.tasks.builder + +import android.content.ContentValues +import android.content.Entity +import androidx.core.content.contentValuesOf +import at.bitfire.ical4android.Task +import at.bitfire.synctools.test.assertContentValuesEqual +import net.fortuna.ical4j.model.property.Status +import net.fortuna.ical4j.model.property.immutable.ImmutableStatus +import org.dmfs.tasks.contract.TaskContract.Tasks +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.RobolectricTestRunner + +@RunWith(RobolectricTestRunner::class) +class StatusBuilderTest { + + private val builder = StatusBuilder() + + @Test + fun `No STATUS defaults to STATUS_DEFAULT`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.STATUS to Tasks.STATUS_DEFAULT + ), result.entityValues) + } + + @Test + fun `STATUS is NEEDS-ACTION`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(status = Status(ImmutableStatus.VALUE_NEEDS_ACTION)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.STATUS to Tasks.STATUS_NEEDS_ACTION + ), result.entityValues) + } + + @Test + fun `STATUS is IN-PROCESS`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(status = Status(ImmutableStatus.VALUE_IN_PROCESS)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.STATUS to Tasks.STATUS_IN_PROCESS + ), result.entityValues) + } + + @Test + fun `STATUS is COMPLETED`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(status = Status(ImmutableStatus.VALUE_COMPLETED)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.STATUS to Tasks.STATUS_COMPLETED + ), result.entityValues) + } + + @Test + fun `STATUS is CANCELLED`() { + val result = Entity(ContentValues()) + builder.build( + from = Task(status = Status(ImmutableStatus.VALUE_CANCELLED)), + to = result + ) + assertContentValuesEqual(contentValuesOf( + Tasks.STATUS to Tasks.STATUS_CANCELLED + ), result.entityValues) + } + +}