def test_datetime_loaded_by_vector2(self): """Testing for the file provided by https://github.com/henrikkriisa""" layer = self.layer_dtimes attr = "measuredts" settings = LayerSettings() settings.layer = layer settings.startTimeAttribute = attr settings.endTimeAttribute = attr timeLayer = timevectorlayer.TimeVectorLayer(settings, iface=Mock()) self.tlm.registerTimeLayer(timeLayer) self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.DatesAsQDateTimes) self.tlm.setTimeFrameType("minutes") self.tlm.stepForward() subsetString = layer.subsetString() expectedSubsetString = STRINGCAST_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_str( self.tlm.getCurrentTimePosition() + timedelta(minutes=1), timeLayer.getTimeFormat()), attr, time_util.datetime_to_str(self.tlm.getCurrentTimePosition(), timeLayer.getTimeFormat())) self.assertEqual(timeLayer.getTimeFormat(), time_util.OGR_DATETIME_FORMAT) self.assertEquals(subsetString, expectedSubsetString)
def test_datetime_loaded_by_vector2(self): """Testing for the file provided by https://github.com/henrikkriisa""" layer = self.layer_dtimes attr = "measuredts" settings = LayerSettings() settings.layer = layer settings.startTimeAttribute = attr settings.endTimeAttribute = attr timeLayer = timevectorlayer.TimeVectorLayer(settings, iface=Mock()) self.tlm.registerTimeLayer(timeLayer) self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.DatesAsQDateTimes) self.tlm.setTimeFrameType("minutes") self.tlm.stepForward() subsetString = layer.subsetString() expectedSubsetString = STRINGCAST_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_str( self.tlm.getCurrentTimePosition() + timedelta(minutes=1), timeLayer.getTimeFormat() ), attr, time_util.datetime_to_str(self.tlm.getCurrentTimePosition(), timeLayer.getTimeFormat()), ) self.assertEqual(timeLayer.getTimeFormat(), time_util.OGR_DATETIME_FORMAT) self.assertEquals(subsetString, expectedSubsetString)
def _test_spatialite_layer(self, attr, layer, is_int=False): timeLayer = timevectorlayer.TimeVectorLayer(layer, attr, attr, True, time_util.DEFAULT_FORMAT, 0) self.tlm.registerTimeLayer(timeLayer) if is_int: self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.IntegerTimestamps) self.assertEquals(timeLayer.getTimeFormat(), time_util.UTC) else: self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.DatesAsStrings) self.assertEquals(timeLayer.getTimeFormat(), time_util.DEFAULT_FORMAT) start_time = time_util.str_to_datetime(timeLayer.getMinMaxValues()[0], time_util.DEFAULT_FORMAT) self.assertEquals(time_util.epoch_to_datetime(STARTTIME), start_time) self.tlm.setTimeFrameType("minutes") self.tlm.stepForward() assert (start_time + timedelta(minutes=1) == self.tlm.getCurrentTimePosition()) # only one feature is selected now, because there is one feature per minute self.assertEquals(layer.featureCount(), 1) FS = 5 self.tlm.setTimeFrameSize(FS) # we have one feature per minute self.assertEquals(layer.featureCount(), FS) subsetString = layer.subsetString() if is_int: expectedSubsetString = INT_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_epoch(self.tlm.getCurrentTimePosition() + timedelta(minutes=FS)), attr, time_util.datetime_to_epoch(self.tlm.getCurrentTimePosition())) self.assertEquals(subsetString, expectedSubsetString) minimum_bound_seconds = int(subsetString.split(" ")[6]) self.assertEquals( self.tlm.getCurrentTimePosition(), time_util.epoch_to_datetime(minimum_bound_seconds)) if not is_int: self.assertEqual(timeLayer.getTimeFormat(), time_util.DEFAULT_FORMAT) expectedSubsetString = STRING_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_str( self.tlm.getCurrentTimePosition() + timedelta(minutes=FS), timeLayer.getTimeFormat()), attr, time_util.datetime_to_str(self.tlm.getCurrentTimePosition(), timeLayer.getTimeFormat())) self.assertEquals(subsetString, expectedSubsetString) self.tlm.stepForward() self.assertEquals(layer.featureCount(), FS)
def _test_spatialite_layer(self, attr, layer, is_int=False): settings = LayerSettings() settings.layer = layer settings.startTimeAttribute = attr settings.endTimeAttribute = attr timeLayer = timevectorlayer.TimeVectorLayer(settings, iface=Mock()) self.tlm.registerTimeLayer(timeLayer) if is_int: self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.IntegerTimestamps) self.assertEquals(timeLayer.getTimeFormat(), time_util.UTC) else: self.assertEquals(timeLayer.getDateType(), timevectorlayer.DateTypes.DatesAsStrings) self.assertEquals(timeLayer.getTimeFormat(), time_util.DEFAULT_FORMAT) start_time = time_util.str_to_datetime(timeLayer.getMinMaxValues()[0], time_util.PENDING) self.assertEquals(time_util.epoch_to_datetime(STARTTIME), start_time) self.tlm.setTimeFrameType("minutes") self.tlm.stepForward() assert start_time + timedelta(minutes=1) == self.tlm.getCurrentTimePosition() # only one feature is selected now, because there is one feature per minute self.assertEquals(layer.featureCount(), 1) FS = 5 self.tlm.setTimeFrameSize(FS) # we have one feature per minute self.assertEquals(layer.featureCount(), FS) subsetString = layer.subsetString() if is_int: expectedSubsetString = INT_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_epoch(self.tlm.getCurrentTimePosition() + timedelta(minutes=FS)), attr, time_util.datetime_to_epoch(self.tlm.getCurrentTimePosition()), ) self.assertEquals(subsetString, expectedSubsetString) minimum_bound_seconds = int(subsetString.split(" ")[6]) self.assertEquals(self.tlm.getCurrentTimePosition(), time_util.epoch_to_datetime(minimum_bound_seconds)) if not is_int: self.assertEqual(timeLayer.getTimeFormat(), time_util.DEFAULT_FORMAT) expectedSubsetString = STRING_FORMAT.format( attr, self.comparison_op, time_util.datetime_to_str( self.tlm.getCurrentTimePosition() + timedelta(minutes=FS), timeLayer.getTimeFormat() ), attr, time_util.datetime_to_str(self.tlm.getCurrentTimePosition(), timeLayer.getTimeFormat()), ) self.assertEquals(subsetString, expectedSubsetString) self.tlm.stepForward() self.assertEquals(layer.featureCount(), FS)
def test_query_for_lexicographically_comparable_format_(self): fmts = ["%d/%m/%Y %H:%M", "%m.%d.%Y %H:%M:%S"] for fmt in fmts: start_str = time_util.datetime_to_str(self.start_dt, fmt) end_str = time_util.datetime_to_str(self.end_dt, fmt) # assert that dates are not lexicographically comparable in this format self.assertTrue(end_str < start_str and self.start_dt < self.end_dt) result_sql = qb.build_query(self.start_dt, self.end_dt, self.from_attr, self.to_attr, qb.DateTypes.DatesAsStrings, fmt, qb.QueryIdioms.SQL, False) result_ogr = qb.build_query(self.start_dt, self.end_dt, self.from_attr, self.to_attr, qb.DateTypes.DatesAsStrings, fmt, qb.QueryIdioms.OGR, False) self.assertEqual(result_sql, result_ogr)
def create_point_db(dest, dbname, starttime, num_items): """ Re-create the point db if it doesn't exist """ if os.path.exists(dest): return # creating/connecting the test_db and getting a cursor conn = db.connect(dest) cur = conn.cursor() # initializing Spatial MetaData # using v.2.4.0 this will automatically create # GEOMETRY_COLUMNS and SPATIAL_REF_SYS sql = "SELECT InitSpatialMetadata()" cur.execute(sql) # print "Spatialite initialized" # creating a POINT table sql = "CREATE TABLE %r (" % (dbname) sql += "{} INTEGER NOT NULL PRIMARY KEY,".format(INTEGER_TIMESTAMP) sql += "name TEXT NOT NULL," sql += "{} DATETIME NOT NULL)".format(STRING_TIMESTAMP) cur.execute(sql) # creating a POINT Geometry column sql = "SELECT AddGeometryColumn('%s'," % (dbname) sql += "'geom', 4326, 'POINT', 2)" cur.execute(sql) # inserting num_items points for i in range(0, num_items): name = "test POINT #%d" % (i + 1) curr_time_epoch = starttime + i * 60 curr_datetime = datetime.utcfromtimestamp(curr_time_epoch) geom = "GeomFromText('POINT(" geom += "%f " % (-10.0 - (i / 10.0)) geom += "%f" % (+10.0 + (i / 10.0)) geom += ")', 4326)" print geom sql = "INSERT INTO {} ({}, name, geom, {}) ".format(dbname, INTEGER_TIMESTAMP, STRING_TIMESTAMP) sql += "VALUES (%d, '%s', %s, '%s')" % ( curr_time_epoch, name, geom, datetime_to_str(curr_datetime, DEFAULT_FORMAT), ) cur.execute(sql) conn.commit()
def create_point_db(dest, dbname, starttime, num_items): """ Re-create the point db if it doesn't exist """ if os.path.exists(dest): return # creating/connecting the test_db and getting a cursor conn = db.connect(dest) cur = conn.cursor() # initializing Spatial MetaData # using v.2.4.0 this will automatically create # GEOMETRY_COLUMNS and SPATIAL_REF_SYS sql = 'SELECT InitSpatialMetadata()' cur.execute(sql) # print "Spatialite initialized" # creating a POINT table sql = 'CREATE TABLE %r (' % (dbname) sql += '{} INTEGER NOT NULL PRIMARY KEY,'.format(INTEGER_TIMESTAMP) sql += 'name TEXT NOT NULL,' sql += '{} DATETIME NOT NULL)'.format(STRING_TIMESTAMP) cur.execute(sql) # creating a POINT Geometry column sql = "SELECT AddGeometryColumn('%s'," % (dbname) sql += "'geom', 4326, 'POINT', 2)" cur.execute(sql) # inserting num_items points for i in range(0, num_items): name = "test POINT #%d" % (i + 1) curr_time_epoch = starttime + i * 60 curr_datetime = datetime.utcfromtimestamp(curr_time_epoch) geom = "GeomFromText('POINT(" geom += "%f " % (-10.0 - (i / 10.0)) geom += "%f" % (+10.0 + (i / 10.0)) geom += ")', 4326)" print geom sql = "INSERT INTO {} ({}, name, geom, {}) ".format( dbname, INTEGER_TIMESTAMP, STRING_TIMESTAMP) sql += "VALUES (%d, '%s', %s, '%s')" % ( curr_time_epoch, name, geom, datetime_to_str(curr_datetime, DEFAULT_FORMAT)) cur.execute(sql) conn.commit()
def test_bc_date_conversions_str(self): for datestr in self.bc_dates: dt = time_util.str_to_datetime(datestr) datestr2 = time_util.datetime_to_str(dt, None) assert (datestr == datestr2)
def test_datetime_to_str_before_1900_works(self): dtstr = "01/12/0100" fmt = "%d/%m/%Y" dt = datetime.strptime(dtstr, fmt) assert (time_util.datetime_to_str(dt, fmt) == dtstr)