157 lines
5.0 KiB
Python
157 lines
5.0 KiB
Python
"""Shared fixtures for tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from physcom.db.schema import init_db
|
|
from physcom.db.repository import Repository
|
|
from physcom.models.entity import Entity, Dependency
|
|
from physcom.models.domain import Domain, MetricBound
|
|
from physcom.models.combination import Combination
|
|
|
|
|
|
@pytest.fixture
|
|
def repo(tmp_path):
|
|
"""Fresh in-memory repository for each test."""
|
|
db_path = tmp_path / "test.db"
|
|
conn = init_db(db_path)
|
|
return Repository(conn)
|
|
|
|
|
|
@pytest.fixture
|
|
def seeded_repo(repo):
|
|
"""Repository pre-loaded with transport seed data."""
|
|
from physcom.seed.transport_example import load_transport_seed
|
|
load_transport_seed(repo)
|
|
return repo
|
|
|
|
|
|
@pytest.fixture
|
|
def walking():
|
|
return Entity(
|
|
name="Walking",
|
|
dimension="platform",
|
|
description="Bipedal locomotion",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("physical", "mass_kg", "150", "kg", "range_max"),
|
|
Dependency("force", "power_density_required_w_kg", "1", "W/kg", "range_min"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def bicycle():
|
|
return Entity(
|
|
name="Bicycle",
|
|
dimension="platform",
|
|
description="Two-wheeled human-scale vehicle",
|
|
dependencies=[
|
|
Dependency("environment", "ground_surface", "true", None, "requires"),
|
|
Dependency("environment", "gravity", "true", None, "requires"),
|
|
Dependency("physical", "mass_kg", "30", "kg", "range_max"),
|
|
Dependency("force", "power_density_required_w_kg", "1", "W/kg", "range_min"),
|
|
Dependency("environment", "medium", "ground", None, "requires"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def spaceship():
|
|
return Entity(
|
|
name="Spaceship",
|
|
dimension="platform",
|
|
description="Vehicle designed for space travel",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
|
Dependency("physical", "mass_kg", "5000", "kg", "range_min"),
|
|
Dependency("force", "power_density_required_w_kg", "500", "W/kg", "range_min"),
|
|
Dependency("environment", "medium", "space", None, "requires"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def solar_sail():
|
|
return Entity(
|
|
name="Solar Sail",
|
|
dimension="power_source",
|
|
description="Propulsion via radiation pressure",
|
|
dependencies=[
|
|
Dependency("environment", "atmosphere", "vacuum_or_thin", None, "requires"),
|
|
Dependency("force", "power_density_w_kg", "0.01", "W/kg", "provides"),
|
|
Dependency("environment", "medium", "space", None, "requires"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def human_pedalling():
|
|
return Entity(
|
|
name="Human Pedalling",
|
|
dimension="power_source",
|
|
description="Human-powered via pedalling",
|
|
dependencies=[
|
|
Dependency("force", "power_density_w_kg", "1.5", "W/kg", "provides"),
|
|
Dependency("physical", "mass_kg", "0", "kg", "range_min"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def nuclear_reactor():
|
|
return Entity(
|
|
name="Modular Nuclear Reactor",
|
|
dimension="power_source",
|
|
description="Small modular nuclear fission reactor",
|
|
dependencies=[
|
|
Dependency("force", "power_density_w_kg", "50", "W/kg", "provides"),
|
|
Dependency("physical", "mass_kg", "2000", "kg", "range_min"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def hydrogen_engine():
|
|
return Entity(
|
|
name="Hydrogen Combustion Engine",
|
|
dimension="power_source",
|
|
description="Hydrogen fuel cell",
|
|
dependencies=[
|
|
Dependency("force", "power_density_w_kg", "1500", "W/kg", "provides"),
|
|
Dependency("physical", "mass_kg", "30", "kg", "range_min"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def ice_engine():
|
|
return Entity(
|
|
name="Internal Combustion Engine",
|
|
dimension="power_source",
|
|
description="Gas-powered engine",
|
|
dependencies=[
|
|
Dependency("force", "power_density_w_kg", "1000", "W/kg", "provides"),
|
|
Dependency("environment", "atmosphere", "standard", None, "requires"),
|
|
Dependency("physical", "mass_kg", "50", "kg", "range_min"),
|
|
],
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def urban_domain():
|
|
return Domain(
|
|
name="urban_commuting",
|
|
description="Daily city travel",
|
|
metric_bounds=[
|
|
MetricBound("speed", weight=0.25, norm_min=5, norm_max=120),
|
|
MetricBound("cost_efficiency", weight=0.25, norm_min=0.01, norm_max=2.0, lower_is_better=True),
|
|
MetricBound("safety", weight=0.25, norm_min=0.0, norm_max=1.0),
|
|
MetricBound("availability", weight=0.15, norm_min=0.0, norm_max=1.0),
|
|
MetricBound("range_fuel", weight=0.10, norm_min=5, norm_max=500),
|
|
],
|
|
)
|