P23-03: 生活の観察
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Local semantic-checker tests; synthetic examples are never game evidence."""
|
||||
import copy
|
||||
import unittest
|
||||
import sys
|
||||
|
||||
sys.dont_write_bytecode = True
|
||||
import check_p23_life_observation_evidence as check
|
||||
|
||||
|
||||
class SemanticTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.guest = dict(guest_id='g', state='QUEUING', current_cell=[1, 0, 0],
|
||||
target_facility_id='f', current_service_id='', queue_request_id='q')
|
||||
self.staff = dict(staff_id='s', state='WORKING', current_cell=[2, 0, 1],
|
||||
current_task_id='t', assigned_facility_id='f', role_id='porter',
|
||||
carried_inventory_id='cargo')
|
||||
self.task = dict(task_id='t', state='WORKING', task_type='delivery',
|
||||
assigned_staff_id='s', target_entity_id='request', rescue_facility_id='')
|
||||
self.snapshot = {'systems': {'runtime': {'guests': {'guests': [self.guest]},
|
||||
'staff': {'staff': [self.staff], 'tasks': [self.task]}}}}
|
||||
self.report = dict(guests=[dict(id='g', state='QUEUING', cell=[1, 0, 0], target='f', service='', queue='q')],
|
||||
staff=[dict(id='s', state='WORKING', cell=[2, 0, 1], task='t', facility='f',
|
||||
role='porter', carried_inventory_id='cargo')],
|
||||
tasks=[dict(id='t', state='WORKING', type='delivery', staff='s',
|
||||
target='request', rescue_facility='')])
|
||||
|
||||
def test_real_schema_projection(self):
|
||||
self.assertEqual(check.compare_actor_rows(self.snapshot, self.report), ['guests', 'staff', 'tasks'])
|
||||
|
||||
def test_changed_state_position_target_task_and_goods_are_rejected(self):
|
||||
for category, field, replacement in [('guests', 'cell', [8, 0, 0]), ('guests', 'target', 'other'),
|
||||
('guests', 'state', 'MOVING'), ('staff', 'task', ''),
|
||||
('staff', 'carried_inventory_id', ''), ('tasks', 'staff', 'other')]:
|
||||
with self.subTest(category=category, field=field):
|
||||
report = copy.deepcopy(self.report)
|
||||
report[category][0][field] = replacement
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_actor_rows(self.snapshot, report)
|
||||
|
||||
def test_missing_extra_and_boolean_only_rows_are_rejected(self):
|
||||
for bad in [[], self.report['guests'] * 2, [True]]:
|
||||
report = copy.deepcopy(self.report)
|
||||
report['guests'] = bad
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_actor_rows(self.snapshot, report)
|
||||
|
||||
def test_unknown_enum_and_duplicate_id_are_rejected(self):
|
||||
self.guest['state'] = 'FICTIONAL'
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_actor_rows(self.snapshot, self.report)
|
||||
self.guest['state'] = 'QUEUING'
|
||||
self.snapshot['systems']['runtime']['guests']['guests'].append(copy.deepcopy(self.guest))
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_actor_rows(self.snapshot, self.report)
|
||||
|
||||
def test_typed_rectangle_and_duplicate_vector_key(self):
|
||||
self.assertEqual(check.decode(dict(type='Rect2', text='Rect2(1, 2, 16, 24)')), [1, 2, 16, 24])
|
||||
with self.assertRaises(ValueError):
|
||||
check.decode(dict(type='Rect2', text='Rect2(1, nan, 16, 24)'))
|
||||
key = dict(type='Vector3i', text='Vector3i(1, 2, 0)')
|
||||
value = dict(type='int', text='1')
|
||||
with self.assertRaises(ValueError):
|
||||
check.decode(dict(type='Dictionary', entries=[[key, value], [key, value]]))
|
||||
|
||||
def test_immutable_typed_input_is_not_modified(self):
|
||||
before = copy.deepcopy(self.snapshot)
|
||||
check.compare_actor_rows(self.snapshot, self.report)
|
||||
self.assertEqual(before, self.snapshot)
|
||||
|
||||
|
||||
class SpatialTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.runtime = dict(world=dict(bounds=dict(min_x=0, max_x=1, min_y=0, max_y=0),
|
||||
walkable_cells=[[0, 0, 0], [1, 0, 0]], occupancies=[]),
|
||||
path=dict(cell_traffic=[dict(cell=[0, 0, 0], base_capacity=2,
|
||||
current_density=3, dynamic_cost=0, temporary_block=False)]),
|
||||
facilities=dict(instances=[], requests=[]), guests=dict(guests=[]),
|
||||
staff=dict(staff=[], tasks=[]), logistics_requests=[],
|
||||
elevators=dict(current_minute=0, shafts=[], trips=[]))
|
||||
self.snapshot = dict(systems=dict(runtime=self.runtime))
|
||||
self.report = dict(viewport=[184, 164], zoom=1, pan=[0, 0], layer=0,
|
||||
traffic=[dict(cell=[0, 0, 0], rect=[78, 72, 12, 20],
|
||||
traffic=dict(base_capacity=2, current_density=3,
|
||||
dynamic_cost=0, temporary_block=False))],
|
||||
queue_positions={}, queue_hidden={}, landing_badges=[], rooms={},
|
||||
treated_patients={}, carried_patients={}, resting_staff={},
|
||||
goods=dict(requests=[], deliveries=[]))
|
||||
|
||||
def test_density_and_pan_are_independently_recomputed(self):
|
||||
check.compare_traffic(self.snapshot, self.report)
|
||||
for key, value in [('current_density', 0), ('base_capacity', 9)]:
|
||||
changed = copy.deepcopy(self.report)
|
||||
changed['traffic'][0]['traffic'][key] = value
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_traffic(self.snapshot, changed)
|
||||
self.report['pan'][0] = 20
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_traffic(self.snapshot, self.report)
|
||||
|
||||
def test_missing_queue_overflow_rejected(self):
|
||||
self.runtime['elevators']['trips'] = [dict(actor_id='guest:g'+str(i), enqueued_at=i,
|
||||
state='QUEUED', **{'from': [0, 0, 0]}) for i in range(3)]
|
||||
self.report.update(queue_positions={'guest/g0': [84, 82], 'guest/g1': [100, 82]},
|
||||
queue_hidden={'guest/g2': True}, landing_badges=[dict(at=[76, 54],
|
||||
text='待ち3人(他1人)', cell=[0, 0, 0],
|
||||
members=['guest/g0', 'guest/g1', 'guest/g2'], visible_count=2, overflow=1)])
|
||||
check.compare_queues(self.snapshot, self.report)
|
||||
self.report['landing_badges'][0]['overflow'] = 0
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_queues(self.snapshot, self.report)
|
||||
|
||||
def test_fictional_goods_and_rooms_rejected(self):
|
||||
check.compare_goods(self.snapshot, self.report)
|
||||
check.compare_room_services(self.snapshot, self.report)
|
||||
self.report['goods']['requests'].append(dict(stock=100))
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_goods(self.snapshot, self.report)
|
||||
self.report['rooms']['invented'] = dict(count=0)
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_room_services(self.snapshot, self.report)
|
||||
|
||||
def test_room_reason_and_rescue_occupancy(self):
|
||||
room = dict(instance_id='clinic', origin=[0, 0, 0], definition_id='infirmary',
|
||||
state='NO_POWER', state_reasons=['NO_POWER'], suspension_reason='',
|
||||
customer_capacity=2, active_staff_ids=[], active_services=[], occupied_cells=[])
|
||||
self.runtime['facilities']['instances'] = [room]
|
||||
self.runtime['staff']['tasks'] = [dict(task_id='rescue', task_type='rescue_transport',
|
||||
state='WORKING', assigned_staff_id='carrier', target_entity_id='patient', rescue_facility_id='clinic')]
|
||||
self.report['treated_patients'] = {'patient': 'clinic'}
|
||||
self.report['rooms'] = {'clinic': dict(state=2, state_name='NO_POWER', reasons=['NO_POWER'],
|
||||
operation=0, people=['patient'], count=1, limit=2, staff=[], suspension='')}
|
||||
check.compare_room_services(self.snapshot, self.report)
|
||||
for field, wrong in [('state', 6), ('operation', 1), ('people', []), ('count', 0)]:
|
||||
changed = copy.deepcopy(self.report)
|
||||
changed['rooms']['clinic'][field] = wrong
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_room_services(self.snapshot, changed)
|
||||
|
||||
def test_cabin_geometry_and_phase(self):
|
||||
shaft = dict(shaft_id='lift', config=dict(stops=[[0, 0, 0]], width=2, capacity=4),
|
||||
current_floor=0, phase='IDLE', operational=True, boarded=[])
|
||||
self.runtime['elevators']['shafts'] = [shaft]
|
||||
self.report.update(paused=True, animation_time=0, elevator_tracks={'lift': dict(floor=0, at=0)},
|
||||
cabins=[dict(shaft_id='lift', rect=[80, 72, 24, 19], pixel=1, operational=True,
|
||||
doors_open=True, badge_at=[80, 58], badge='0/4人', passengers=[])])
|
||||
check.compare_cabin_geometry(self.snapshot, self.report)
|
||||
for field, value in [('rect', [80, 70, 24, 19]), ('doors_open', False), ('badge', '4/4人')]:
|
||||
changed = copy.deepcopy(self.report)
|
||||
changed['cabins'][0][field] = value
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_cabin_geometry(self.snapshot, changed)
|
||||
|
||||
|
||||
class ComparisonTests(unittest.TestCase):
|
||||
def pair(self):
|
||||
declaration = dict(metric='sum_destination_arrival_minutes_entire_cohort',
|
||||
arrivals=[dict(id='g', offset=0)], window=2, to=[2, 1, 0],
|
||||
improvement=dict(definition_id='guest_elevator', origin=[4, 0, 0]))
|
||||
a = dict(declaration=declaration, initial=dict(seed=1))
|
||||
a['arrival-g'] = dict(offset=0, payload=dict(guest_id='g'), result=dict(code='OK'))
|
||||
for minute in range(3):
|
||||
a['tick-%03d' % minute] = dict(minute=minute, guests=dict(guests=[dict(guest_id='g',
|
||||
current_cell=[2, 1, 0] if minute == 2 else [2, 0, 0])]))
|
||||
b = copy.deepcopy(a)
|
||||
b['build-0'] = dict(payload=declaration['improvement'], result=dict(code='OK'))
|
||||
b['tick-001']['guests']['guests'][0]['current_cell'] = [2, 1, 0]
|
||||
return a, b
|
||||
|
||||
def test_strict_metric_from_typed_cells(self):
|
||||
a, b = self.pair()
|
||||
self.assertEqual(check.compare_layouts(a, b)['B'], 1)
|
||||
for mutation in ('demand', 'incomplete', 'no_improvement', 'extra_build'):
|
||||
with self.subTest(mutation=mutation):
|
||||
a, b = self.pair()
|
||||
if mutation == 'demand':
|
||||
b['arrival-g']['payload']['guest_id'] = 'other'
|
||||
elif mutation == 'incomplete':
|
||||
for minute in (1, 2):
|
||||
b['tick-%03d' % minute]['guests']['guests'][0]['current_cell'] = [2, 0, 0]
|
||||
elif mutation == 'no_improvement':
|
||||
b['tick-001'] = copy.deepcopy(a['tick-001'])
|
||||
else:
|
||||
b['build-1'] = copy.deepcopy(b['build-0'])
|
||||
with self.assertRaises(ValueError):
|
||||
check.compare_layouts(a, b)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user