P23-03: 生活の観察
This commit is contained in:
@@ -1848,6 +1848,127 @@ class AnchoredGeometryTests(unittest.TestCase):
|
||||
check.compare_actor_geometry(self.snapshot, report)
|
||||
|
||||
|
||||
class CabinLandingTests(unittest.TestCase):
|
||||
"""Constructed raw topology; explicit expected draws, never OS evidence."""
|
||||
setUp = AnchoredGeometryTests.setUp
|
||||
person = AnchoredGeometryTests.person
|
||||
drawing = AnchoredGeometryTests.drawing
|
||||
|
||||
def lift(self, floor=0):
|
||||
self.runtime['elevators']['shafts'] = [dict(
|
||||
config=dict(shaft_id='lift', stops=[[1,0,0], [1,1,0]], width=2, capacity=4),
|
||||
current_floor=0, phase='PICKUP', boarding_floor=1, phase_origin_floor=0,
|
||||
remaining_minutes=10*(1-floor), phase_total_minutes=10, operational=True, boarded=[])]
|
||||
self.report['elevator_tracks'] = {'lift': dict(floor=floor, **{'from': floor}, at=0)}
|
||||
# The transform is 64x96; the full two-cell cabin is 96x76.
|
||||
y = check.math.copysign(check.math.floor(abs(174-96*floor)+.5), 174-96*floor)
|
||||
self.report['cabins'] = [dict(shaft_id='lift', rect=[156,y,96,76], pixel=4,
|
||||
operational=True, doors_open=False, badge_at=[156,y-14], passengers=[])]
|
||||
synthetic_repair28_fields(self.report, self.snapshot)
|
||||
|
||||
def test_moving_guest_same_floor_and_old_position_negative(self):
|
||||
self.lift()
|
||||
self.person('guest/g', [1,0,0])
|
||||
self.drawing('guest/g', [108,214])
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
bad = copy.deepcopy(self.report)
|
||||
bad['actor_drawings'][0].update(center=[172,214], at=[148,199])
|
||||
with self.assertRaisesRegex(ValueError, 'non-passenger inside cabin'):
|
||||
check.compare_actor_geometry(self.snapshot, bad)
|
||||
|
||||
def test_transit_from_lift_to_corridor_is_relocated_before_jitter(self):
|
||||
self.lift()
|
||||
self.person('guest/g', [0,0,0])
|
||||
self.report.update(paused=False, animation_time=.21)
|
||||
self.report['actor_tracks']['guest/g']['from'] = [1,0,0]
|
||||
row = self.drawing('guest/g', [108,214], 'walk')
|
||||
row['frame'] += 2
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
bad = copy.deepcopy(self.report)
|
||||
bad['actor_drawings'][0]['center'][0] += 1
|
||||
with self.assertRaisesRegex(ValueError, 'actor fitted center'):
|
||||
check.compare_actor_geometry(self.snapshot, bad)
|
||||
|
||||
def test_carrier_and_raised_patient_follow_relocated_region(self):
|
||||
self.lift()
|
||||
self.person('staff/carrier', [1,0,0], 'AVAILABLE')
|
||||
self.person('staff/patient', [1,0,0], 'INCAPACITATED')
|
||||
self.runtime['staff']['tasks'] = [dict(task_type='rescue_transport', state='MOVING',
|
||||
assigned_staff_id='carrier', target_entity_id='patient', rescue_facility_id='')]
|
||||
self.report['carried_patients'] = {'patient': 'carrier'}
|
||||
self.drawing('staff/carrier', [108,214])
|
||||
self.drawing('staff/patient', [108,166], 'collapsed')
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
self.assertTrue(all(not check.intersects(check.actor_identity_core(r), self.report['cabins'][0]['rect'])
|
||||
for r in self.report['actor_drawings']))
|
||||
|
||||
def test_fractional_moving_cabin_overlaps_floor_above(self):
|
||||
self.lift(.8)
|
||||
self.person('guest/g', [1,1,0])
|
||||
self.drawing('guest/g', [108,118])
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
|
||||
def test_no_lane_aggregates_identity_and_never_drops_silently(self):
|
||||
self.lift()
|
||||
self.runtime['world']['walkable_cells'] = [[1,0,0], [2,0,0]]
|
||||
self.person('guest/g', [1,0,0])
|
||||
self.report['actor_aggregations'] = [dict(members=[dict(key='guest/g', id='g', state=3,
|
||||
cell=[1,0,0], mode='idle')], drawn_keys=[], at=[60,150], text='+1')]
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
for mutation in ('badge', 'identity', 'hidden'):
|
||||
bad = copy.deepcopy(self.report)
|
||||
if mutation == 'badge': bad['actor_aggregations'][0]['at'][0] += 1
|
||||
if mutation == 'identity': bad['actor_aggregations'][0]['members'] = []
|
||||
if mutation == 'hidden':
|
||||
bad['actor_aggregations'] = []
|
||||
bad['queue_hidden'] = {'guest/g': True}
|
||||
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||
check.compare_actor_geometry(self.snapshot, bad)
|
||||
self.person('guest/h', [1,0,0])
|
||||
aggregate = self.report['actor_aggregations'][0]
|
||||
aggregate['members'].append(dict(key='guest/h', id='h', state=3, cell=[1,0,0], mode='idle'))
|
||||
aggregate['text'] = '+2'
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
|
||||
def test_reserved_lane_prefers_free_then_shares_with_queue(self):
|
||||
self.lift()
|
||||
self.person('guest/q', [1,0,0], 'QUEUING')
|
||||
self.person('guest/g', [1,0,0])
|
||||
self.runtime['elevators']['trips'] = [dict(request_id='queue', actor_id='guest:q', state='QUEUED',
|
||||
shaft_id='lift', connector_id='lift.link.0.1', enqueued_at=0,
|
||||
**{'from': [1,0,0], 'to': [1,1,0]})]
|
||||
self.report.update(queue_positions={'guest/q':[108,214]},
|
||||
landing_badges=[dict(at=[60,150], text='待ち1人', cell=[1,0,0],
|
||||
members=['guest/q'], visible_count=1, overflow=0)])
|
||||
self.drawing('guest/q', [108,214], 'wait')
|
||||
self.drawing('guest/g', [300,214])
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
self.runtime['world']['walkable_cells'].remove([3,0,0])
|
||||
self.report['actor_drawings'][0].update(at=[100,199])
|
||||
self.report['actor_drawings'][1].update(center=[108,214], at=[82,199])
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
|
||||
def test_flags_drop_and_unnecessary_relocation_fail(self):
|
||||
self.lift()
|
||||
self.person('guest/g', [1,0,0])
|
||||
self.drawing('guest/g', [108,214])
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
for mutation in ('riding', 'region', 'boarded', 'drop'):
|
||||
bad = copy.deepcopy(self.report)
|
||||
if mutation == 'riding': bad['actor_drawings'][0]['riding'] = True
|
||||
if mutation == 'region':
|
||||
bad['actor_drawings'][0]['region'] = 'landing'
|
||||
if mutation == 'boarded': bad['boarded']['guest/g'] = True
|
||||
if mutation == 'drop': bad['actor_drawings'] = []
|
||||
with self.subTest(mutation=mutation), self.assertRaises(ValueError):
|
||||
check.compare_actor_geometry(self.snapshot, bad)
|
||||
# A free corridor actor must remain at its actual cell, even beside a lift.
|
||||
self.runtime['guests']['guests'][0]['current_cell'] = [3,0,0]
|
||||
self.report['actor_tracks']['guest/g'].update(cell=[3,0,0], **{'from': [3,0,0]})
|
||||
with self.assertRaisesRegex(ValueError, 'actor fitted'):
|
||||
check.compare_actor_geometry(self.snapshot, self.report)
|
||||
|
||||
|
||||
class ComparisonTests(unittest.TestCase):
|
||||
def pair(self):
|
||||
declaration = dict(metric='sum_destination_arrival_minutes_entire_cohort',
|
||||
|
||||
Reference in New Issue
Block a user