Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit e8f3c1b

Browse files
rduivenvoordegithub-actions[bot]
authored andcommittedSep 4, 2022
Add test to test for Date fields (should be casted)
1 parent 7562cbc commit e8f3c1b

File tree

1 file changed

+205
-0
lines changed

1 file changed

+205
-0
lines changed
 

‎tests/src/python/test_qgsvectorlayertemporalproperties.py

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,211 @@ def testDualFieldMode(self):
610610
self.assertEqual(props.createFilterString(context, range), '"end_field" >= make_datetime(2019,3,4,11,12,13) OR "end_field" IS NULL')
611611
props.setLimitMode(Qgis.VectorTemporalLimitMode.IncludeBeginExcludeEnd) # back to default
612612

613+
614+
def testDualFieldModeDates(self):
615+
# this test is exact the same like: testDualFieldMode, except that the layer definition holds date fields instead of datetime fields
616+
# so we have to do the casting casting (which could be missed, see #48946)
617+
618+
layer = QgsVectorLayer("Point?field=fldtxt:string&field=fldint:integer&field=start_field:date&field=end_field:date", "test", "memory")
619+
620+
self.assertTrue(layer.isValid())
621+
self.assertEqual(layer.fields()[2].type(), QVariant.Date)
622+
self.assertEqual(layer.fields()[3].type(), QVariant.Date)
623+
context = QgsVectorLayerTemporalContext()
624+
context.setLayer(layer)
625+
626+
# includes beginning AND end
627+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))
628+
629+
props = QgsVectorLayerTemporalProperties(enabled=False)
630+
props.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeStartAndEndFromFields)
631+
props.setStartField('start_field')
632+
props.setEndField('end_field')
633+
self.assertFalse(props.createFilterString(context, range))
634+
635+
props.setIsActive(True)
636+
# map range [-------------------------]
637+
# feature ranges . . [-------) (false)
638+
# . [-------) (true)
639+
# . [---.---) (true)
640+
# . [-------) . (true)
641+
# [-------) . (true)
642+
# [---.---) . (true)
643+
# [-------) . (false)
644+
# [-------) . . (false)
645+
#
646+
# => start of feature <= end of range AND end of feature > start of range
647+
self.assertEqual(props.createFilterString(context, range), '(to_datetime( "start_field" ) <= make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL) AND (to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL)')
648+
649+
# map range (-------------------------)
650+
# feature ranges . . [-------) (false)
651+
# . [-------) (false)
652+
# . [---.---) (true)
653+
# . [-------) . (true)
654+
# [-------) . (true)
655+
# [---.---) . (true)
656+
# [-------) . (false)
657+
# [-------) . . (false)
658+
#
659+
# => start of feature < end of range AND end of feature > start of range
660+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False, includeEnd=False)
661+
self.assertEqual(props.createFilterString(context, range), '(to_datetime( "start_field" ) < make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL) AND (to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL)')
662+
663+
# map range (-------------------------]
664+
# feature ranges . . [-------) (false)
665+
# . [-------) (true)
666+
# . [---.---) (true)
667+
# . [-------) . (true)
668+
# [-------) . (true)
669+
# [---.---) . (true)
670+
# [-------) . (false)
671+
# [-------) . . (false)
672+
#
673+
# => start of feature <= end of range AND end of feature > start of range
674+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False)
675+
self.assertEqual(props.createFilterString(context, range), '(to_datetime( "start_field" ) <= make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL) AND (to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL)')
676+
677+
# THIS is the QGIS default: using a range with includeBeginning=true and includeEnd=false
678+
# map range [-------------------------)
679+
# feature ranges . . [-------) (false)
680+
# . [-------) (false)
681+
# . [---.---) (true)
682+
# . [-------) . (true)
683+
# [-------) . (true)
684+
# [---.---) . (true)
685+
# [-------) . (false)
686+
# [-------) . . (false)
687+
#
688+
# => start of feature < end of range AND end of feature > start of range
689+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False)
690+
self.assertEqual(props.createFilterString(context, range), '(to_datetime( "start_field" ) < make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL) AND (to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL)')
691+
# since 3.22 there is also the option to include the end of the feature event
692+
props.setLimitMode(Qgis.VectorTemporalLimitMode.IncludeBeginIncludeEnd)
693+
# map range [-------------------------)
694+
# feature ranges . . [-------] (false)
695+
# . [-------] (false)
696+
# . [---.---] (true)
697+
# . [-------] . (true)
698+
# [-------] . (true)
699+
# [---.---] . (true)
700+
# [-------] . (true)
701+
# [-------] . . (false)
702+
#
703+
# => start of feature < end of range AND end of feature >= start of range
704+
self.assertEqual(props.createFilterString(context, range), '(to_datetime( "start_field" ) < make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL) AND (to_datetime( "end_field" ) >= make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL)')
705+
props.setLimitMode(Qgis.VectorTemporalLimitMode.IncludeBeginExcludeEnd) # back to default
706+
707+
# features go to +eternity
708+
props.setEndField('')
709+
# includes beginning AND end
710+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))
711+
# map range [-------------------------]
712+
# feature ranges . . [--------> (false)
713+
# . [----------> (true)
714+
# . [------------.----------> (true)
715+
# [-------------------------.----------> (true)
716+
# [-------------.-------------------------.----------> (true)
717+
#
718+
# => start of feature <= end of range
719+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "start_field" ) <= make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL')
720+
721+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False, includeEnd=False)
722+
# map range (-------------------------)
723+
# feature ranges . . [--------> (false)
724+
# . [----------> (false)
725+
# . [------------.----------> (true)
726+
# [-------------------------.----------> (true)
727+
# [-------------.-------------------------.----------> (true)
728+
#
729+
# => start of feature < end of range
730+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "start_field" ) < make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL')
731+
732+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False)
733+
# map range (-------------------------]
734+
# feature ranges . . [--------> (false)
735+
# . [----------> (true)
736+
# . [------------.----------> (true)
737+
# [-------------------------.----------> (true)
738+
# [-------------.-------------------------.----------> (true)
739+
#
740+
# => start of feature <= end of range
741+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "start_field" ) <= make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL')
742+
743+
# THIS is the QGIS default: using a range with includeBeginning=true and includeEnd=false
744+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False)
745+
# map range [-------------------------)
746+
# feature ranges . . [--------> (false)
747+
# . [----------> (false)
748+
# . [------------.----------> (true)
749+
# [-------------------------.----------> (true)
750+
# [-------------.-------------------------.----------> (true)
751+
#
752+
# => start of feature < end of range
753+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "start_field" ) < make_datetime(2020,5,6,8,9,10) OR to_datetime( "start_field" ) IS NULL')
754+
755+
# features start at -eternity
756+
props.setStartField('')
757+
props.setEndField('end_field')
758+
# includes beginning AND end
759+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)))
760+
# map range [-------------------------]
761+
# feature ranges --------.-------------------------.---------) (true)
762+
# --------.-------------------------) (true)
763+
# --------.--------------------) . (true)
764+
# --------) . (false)
765+
# -----) . (false)
766+
#
767+
# => end of feature > start of range
768+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL')
769+
770+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False, includeEnd=False)
771+
# map range (-------------------------)
772+
# feature ranges --------.-------------------------.---------) (true)
773+
# --------.-------------------------) (true)
774+
# --------.--------------------) . (true)
775+
# --------) . (false)
776+
# -----) . (false)
777+
#
778+
# => end of feature > start of range
779+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL')
780+
781+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeBeginning=False)
782+
# map range (-------------------------]
783+
# feature ranges --------.-------------------------.---------) (true)
784+
# --------.-------------------------) (true)
785+
# --------.--------------------) . (true)
786+
# --------) . (false)
787+
# -----) . (false)
788+
#
789+
# => end of feature > start of range
790+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL')
791+
792+
# THIS is the QGIS default: using a range with includeBeginning=true and includeEnd=false
793+
range = QgsDateTimeRange(QDateTime(QDate(2019, 3, 4), QTime(11, 12, 13)), QDateTime(QDate(2020, 5, 6), QTime(8, 9, 10)), includeEnd=False)
794+
# map range [-------------------------)
795+
# feature ranges --------.-------------------------.---------) (true)
796+
# --------.-------------------------) (true)
797+
# --------.--------------------) . (true)
798+
# --------) . (false)
799+
# -----) . (false)
800+
#
801+
# => end of feature > start of range
802+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "end_field" ) > make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL')
803+
# since 3.22 there is also the option to include the end of the feature event
804+
# => end of feature >= start of range
805+
props.setLimitMode(Qgis.VectorTemporalLimitMode.IncludeBeginIncludeEnd)
806+
# map range [-------------------------)
807+
# feature ranges --------.-------------------------.---------] (true)
808+
# --------.-------------------------] (true)
809+
# --------.--------------------] . (true)
810+
# --------] . (true)
811+
# -----] . (false)
812+
#
813+
# => end of feature >= start of range
814+
self.assertEqual(props.createFilterString(context, range), 'to_datetime( "end_field" ) >= make_datetime(2019,3,4,11,12,13) OR to_datetime( "end_field" ) IS NULL')
815+
props.setLimitMode(Qgis.VectorTemporalLimitMode.IncludeBeginExcludeEnd) # back to default
816+
817+
613818
def testStartAndDurationMode(self):
614819
layer = QgsVectorLayer(
615820
"Point?field=fldtxt:string&field=fldint:integer&field=start_field:datetime&field=duration:double",

0 commit comments

Comments
 (0)
Please sign in to comment.