Coverage for tests/historicalletters/test_utils.py: 100%
38 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-15 13:13 +0200
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-15 13:13 +0200
1import math
2from unittest.mock import Mock, patch
3from collections import Counter
4import pandas as pd
5import geopandas as gpd
6from shapely import Point, LineString, contains
7from pathlib import Path
8import pytest
10from scicom.historicalletters.model import HistoricalLetters
12from scicom.historicalletters.utils import (
13 createData,
14 getPositionOnLine,
15 getRegion
16)
18######
19# Utility function testing
20######
23def test_initial_population_creation(tmp_path):
24 """Initial population should contain
25 lat/long and geometry information.
26 The chosen CRS is essential since overlap
27 calculation depends on the regions CRS.
28 """
29 file = createData(
30 population=30,
31 populationDistribution=Path(Path(__file__).parent.parent.parent.resolve(), "src/scicom/data/pone.0162678.s003.csv")
32 )
33 assert isinstance(file, gpd.GeoDataFrame)
34 assert file.shape[0] == 30
35 for col in ["longitude", "latitude", "unique_id", "geometry"]:
36 assert col in list(file.columns)
37 assert file.crs == "EPSG:3857"
40def test_getPositionOnLine():
41 """Get random point on line between two points.
42 Return type is either a shaple geometry Point,
43 or a tuple of coordinates."""
44 p1 = (0.3,0.2,0.3)
45 p2 = (0.5, 0.4,0.9)
46 p3 = getPositionOnLine(p1,p2)
47 assert isinstance(p3, Point)
48 line = LineString([p1,p2])
49 assert contains(line, p3)
50 p4 = getPositionOnLine(p1,p2, returnType="coords")
51 assert isinstance(p4, tuple)
54def test_getRegion():
55 """Returns the id of the overlaping region
56 for a given agent."""
57 model = HistoricalLetters(10)
58 a1 = model.schedule.agents[0]
59 ## New York coord
60 coord = (40.712728, -74.006015)
61 d1 = pd.DataFrame([coord], columns=["lat", "long"])
62 geodf = gpd.GeoDataFrame(
63 d1,
64 geometry=gpd.points_from_xy(d1.long, d1.lat),
65 crs="EPSG:4326"
66 )
67 geodf.to_crs("EPSG:3857")
68 a2fail = geodf.geometry.iloc[0]
69 reg = getRegion(a1.geometry, model)
70 assert isinstance(reg, str)
71 with pytest.raises(IndexError):
72 getRegion(a2fail, model)