diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg deleted file mode 100644 index 72d99e63ab..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg +++ /dev/null @@ -1 +0,0 @@ -Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_activated_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_activated_flight.svg new file mode 100644 index 0000000000..212e8b03cf --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_activated_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_planned_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_planned_flight.svg new file mode 100644 index 0000000000..f394f91d61 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict_with_planned_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg deleted file mode 100644 index 1ae3bad70d..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg +++ /dev/null @@ -1 +0,0 @@ -Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_activated_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_activated_flight.svg new file mode 100644 index 0000000000..512367b34d --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_activated_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_planned_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_planned_flight.svg new file mode 100644 index 0000000000..2f051ed2b8 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict_with_planned_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg deleted file mode 100644 index 55859264e8..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg +++ /dev/null @@ -1 +0,0 @@ -Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_activated_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_activated_flight.svg new file mode 100644 index 0000000000..29fec9935f --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_activated_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_planned_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_planned_flight.svg new file mode 100644 index 0000000000..dad6551e5c --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict_with_planned_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg deleted file mode 100644 index a52a46a4d3..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg +++ /dev/null @@ -1 +0,0 @@ -Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_activated_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_activated_flight.svg new file mode 100644 index 0000000000..a8b3b2486b --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_activated_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_planned_flight.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_planned_flight.svg new file mode 100644 index 0000000000..b73eb505eb --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict_with_planned_flight.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py index d0b905cd35..7a7b385b6f 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py @@ -1,4 +1,5 @@ # Requires svg.py 1.4.2 +# Can be run with: uv run --with svg.py make_assets.py import inspect from textwrap import dedent @@ -51,24 +52,24 @@ def translate(points: list[float], dx: float, dy: float) -> list[float]: ] -def make_attempt_to_plan_flight_into_conflict(): +def make_attempt_to_plan_flight_into_conflict(flight2_fill: str, suffix: str): elements = [ svg.Polygon( points=flight2_points, stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight2_points, 440, 0), stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75 + 440, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight1_points, 440, 0), stroke=outline, @@ -94,28 +95,30 @@ def make_attempt_to_plan_flight_into_conflict(): height=200, elements=common_elements + elements, ) - with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + with open( + inspect.currentframe().f_code.co_name[len("make_") :] + suffix + ".svg", "w" + ) as f: f.write(str(canvas)) -def make_attempt_to_activate_flight_into_conflict(): +def make_attempt_to_activate_flight_into_conflict(flight2_fill: str, suffix: str): elements = [ svg.Polygon( points=flight2_points, stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight2_points, 440, 0), stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75 + 440, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight1_points, 440, 0), stroke=outline, @@ -141,20 +144,22 @@ def make_attempt_to_activate_flight_into_conflict(): height=200, elements=common_elements + elements, ) - with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + with open( + inspect.currentframe().f_code.co_name[len("make_") :] + suffix + ".svg", "w" + ) as f: f.write(str(canvas)) -def make_attempt_to_modify_planned_flight_into_conflict(): +def make_attempt_to_modify_planned_flight_into_conflict(flight2_fill: str, suffix: str): elements = [ svg.Polygon( points=flight2_points, stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=flight1c_points, stroke=outline, @@ -162,15 +167,21 @@ def make_attempt_to_modify_planned_flight_into_conflict(): fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=217, y=145, class_=["heavy"], text="Flight 1c"), + svg.Text( + x=225, + y=145, + class_=["heavy"], + style="font-size: 24px", + text="Flight 1c", + ), svg.Polygon( points=translate(flight2_points, 440, 0), stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75 + 440, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight1_points, 440, 0), stroke=outline, @@ -179,7 +190,7 @@ def make_attempt_to_modify_planned_flight_into_conflict(): stroke_width=8, stroke_dasharray=[16], ), - svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1"), + svg.Text(x=220 + 440, y=140, class_=["heavy"], text="Flight 1"), svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), svg.Line( x1=370, @@ -196,20 +207,24 @@ def make_attempt_to_modify_planned_flight_into_conflict(): height=200, elements=common_elements + elements, ) - with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + with open( + inspect.currentframe().f_code.co_name[len("make_") :] + suffix + ".svg", "w" + ) as f: f.write(str(canvas)) -def make_attempt_to_modify_activated_flight_into_conflict(): +def make_attempt_to_modify_activated_flight_into_conflict( + flight2_fill: str, suffix: str +): elements = [ svg.Polygon( points=flight2_points, stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=flight1c_points, stroke=outline, @@ -217,15 +232,21 @@ def make_attempt_to_modify_activated_flight_into_conflict(): fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=217, y=145, class_=["heavy"], text="Flight 1c"), + svg.Text( + x=225, + y=145, + class_=["heavy"], + style="font-size: 24px", + text="Flight 1c", + ), svg.Polygon( points=translate(flight2_points, 440, 0), stroke=outline, - fill=activated, + fill=flight2_fill, fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75 + 440, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight1_points, 440, 0), stroke=outline, @@ -234,7 +255,7 @@ def make_attempt_to_modify_activated_flight_into_conflict(): stroke_width=8, stroke_dasharray=[16], ), - svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1"), + svg.Text(x=220 + 440, y=140, class_=["heavy"], text="Flight 1"), svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), svg.Line( x1=370, @@ -251,7 +272,9 @@ def make_attempt_to_modify_activated_flight_into_conflict(): height=200, elements=common_elements + elements, ) - with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + with open( + inspect.currentframe().f_code.co_name[len("make_") :] + suffix + ".svg", "w" + ) as f: f.write(str(canvas)) @@ -272,7 +295,7 @@ def make_modify_activated_flight_with_preexisting_conflict(): fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight2_points, 440, 0), stroke=outline, @@ -280,7 +303,7 @@ def make_modify_activated_flight_with_preexisting_conflict(): fill_opacity=0.4, stroke_width=8, ), - svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Text(x=75 + 440, y=90, class_=["heavy"], text="Flight 2"), svg.Polygon( points=translate(flight1m_points, 440, 0), stroke=outline, @@ -308,8 +331,12 @@ def make_modify_activated_flight_with_preexisting_conflict(): f.write(str(canvas)) -make_attempt_to_plan_flight_into_conflict() -make_attempt_to_activate_flight_into_conflict() -make_attempt_to_modify_planned_flight_into_conflict() -make_attempt_to_modify_activated_flight_into_conflict() +for flight2_fill, suffix in ( + (activated, "_with_activated_flight"), + (accepted, "_with_planned_flight"), +): + make_attempt_to_plan_flight_into_conflict(flight2_fill, suffix) + make_attempt_to_activate_flight_into_conflict(flight2_fill, suffix) + make_attempt_to_modify_planned_flight_into_conflict(flight2_fill, suffix) + make_attempt_to_modify_activated_flight_into_conflict(flight2_fill, suffix) make_modify_activated_flight_with_preexisting_conflict() diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg index a02b0c7a92..07ea77b9fd 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg @@ -1 +1 @@ -Flight 1Flight 2Flight 2Flight 1m \ No newline at end of file +Flight 1Flight 2Flight 2Flight 1m \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md index c2d4159b05..7f10d13ead 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md @@ -104,8 +104,101 @@ DSSInstanceResource that provides access to a DSS instance where flight creation While this scenario assumes that the area used is already clear of any pre-existing flights (using, for instance, PrepareFlightPlanners scenario) in order to avoid a large number of area-clearing operations, the scenario will not proceed correctly if the area was left in a dirty state following a previous scenario that was supposed to leave the area clear. This test step verifies that the area is clear. -## Attempt to plan flight into conflict test case -![Test case summary illustration](assets/attempt_to_plan_flight_into_conflict.svg) + +## Attempt to plan flight into conflict with planned flight test case +![Test case summary illustration](assets/attempt_to_plan_flight_into_conflict_with_planned_flight.svg) + +### Plan Flight 2 test step + +#### [Plan Flight 2](../../../../flight_planning/plan_flight_intent.md) +Flight 2 should be successfully planned by the control USS. + +#### [Validate Flight 2 sharing](../../validate_shared_operational_intent.md) + +### Attempt to plan Flight 1 test step + +#### [Attempt to plan Flight 1](../../../../flight_planning/plan_conflict_flight_intent.md) +The test driver attempts to plan the Flight 1 via the tested USS. However, it conflicts with planned Flight 2 +which is of equal priority but came first. As such it should be rejected +per **[astm.f3548.v21.SCD0035](../../../../../requirements/astm/f3548/v21.md)**. + +#### [Validate Flight 1 not shared](../../validate_not_shared_operational_intent.md) +Flight 1 should not have been shared with the interoperability ecosystem since it was rejected. + +## Attempt to activate flight into conflict with planned flight test case +![Test case summary illustration](assets/attempt_to_activate_flight_into_conflict_with_planned_flight.svg) + +### Attempt to directly activate conflicting Flight 1 test step + +#### [Attempt to activate Flight 1](../../../../flight_planning/activate_conflict_flight_intent.md) +The test driver attempts to activate directly Flight 1, i.e. without the flight being planned before. +However, this conflicts with planned Flight 2, which is of equal priority. As such it should be rejected +per **[astm.f3548.v21.SCD0045](../../../../../requirements/astm/f3548/v21.md)**. + +#### [Validate Flight 1 not shared](../../validate_not_shared_operational_intent.md) +Flight 1 should not have been shared with the interoperability ecosystem since it was rejected. + +## Attempt to modify planned flight into conflict with planned flight test case +![Test case summary illustration](assets/attempt_to_modify_planned_flight_into_conflict_with_planned_flight.svg) + +### Plan Flight 1c test step + +#### [Plan Flight 1c](../../../../flight_planning/plan_flight_intent.md) +The smaller Flight 1c form (which doesn't conflict with Flight 2) should be successfully planned by the tested USS. + +#### ⚠️ Validate tested USS intersection algorithm check +Because Flight 2 is nearby Flight 1c, successful planning of Flight 1c indicates the tested USS is complying with the portion of +**[astm.f3548.v21.GEN0500](../../../../../requirements/astm/f3548/v21.md)** that requires a USS to indicate two 4D volumes are non-intersecting when they are separated by more than 1 cm. + +This check is not relevant if the planning is rejected. + +#### [Validate Flight 1c sharing](../../validate_shared_operational_intent.md) + +### Attempt to modify planned Flight 1c into conflict test step + +#### [Attempt to modify Flight 1c](../../../../flight_planning/modify_planned_conflict_flight_intent.md) +The test driver attempts to enlarge Flight 1c so that it conflicts with planned Flight 2. +However, Flight 2 is of equal priority but was planned first. +As such the change to Flight 1c should be rejected per **[astm.f3548.v21.SCD0040](../../../../../requirements/astm/f3548/v21.md)**. + +#### [Validate Flight 1c not modified](../../validate_shared_operational_intent.md) +Because the modification attempt was invalid, either Flight 1c should not have been modified (because the USS kept the +original accepted request), or it should have been removed (because the USS rejected the replacement plan provided). + +## Attempt to modify activated flight into conflict with planned flight test case +![Test case summary illustration](assets/attempt_to_modify_activated_flight_into_conflict_with_planned_flight.svg) + +### Activate Flight 1c test step + +#### [Activate Flight 1c](../../../../flight_planning/activate_flight_intent.md) +The test driver activates the smaller Flight 1c form, which should be done successfully. +Note that Flight 1c could be either planned or non-existent before this step. In the latter case, the "user" will +directly activate the flight without planning it beforehand. + +#### [Validate Flight 1c sharing](../../validate_shared_operational_intent.md) + +### Attempt to modify activated Flight 1c into conflict test step + +#### [Attempt to modify Flight 1c](../../../../flight_planning/modify_activated_conflict_flight_intent.md) +The test driver attempts to enlarge Flight 1c so that it conflicts with planned Flight 2. +Because the conflict did not exist when the modification was initiated, it should be rejected +per **[astm.f3548.v21.SCD0050](../../../../../requirements/astm/f3548/v21.md)**. +In addition, Flight 1c should not have been removed, because doing so would leave an aircraft in flight without any flight plan. + +#### [Validate Flight 1c not modified](../../validate_not_shared_operational_intent.md) +Because the modification attempt was invalid, Flight 1c should not have been modified. + +### [Delete Flight 1c if USS did not support its modification test step](../../../../flight_planning/delete_flight_intent.md) +If, during the previous step, the USS indicated that it does not support modifications, the test driver deletes Flight 1c. + +### [Delete Flight 2 test step](../../../../flight_planning/delete_flight_intent.md) +To prepare for the next test case, Flight 2 must be removed from the system. + +### [Delete Flight 1c test step](../../../../flight_planning/delete_flight_intent.md) +To prepare for the next test case, Flight 1c must be removed from the system if it was not already. + +## Attempt to plan flight into conflict with activated flight test case +![Test case summary illustration](assets/attempt_to_plan_flight_into_conflict_with_activated_flight.svg) ### Plan Flight 2 test step @@ -131,8 +224,8 @@ per **[astm.f3548.v21.SCD0035](../../../../../requirements/astm/f3548/v21.md)**. #### [Validate Flight 1 not shared](../../validate_not_shared_operational_intent.md) Flight 1 should not have been shared with the interoperability ecosystem since it was rejected. -## Attempt to activate flight into conflict test case -![Test case summary illustration](assets/attempt_to_activate_flight_into_conflict.svg) +## Attempt to activate flight into conflict with activated flight test case +![Test case summary illustration](assets/attempt_to_activate_flight_into_conflict_with_activated_flight.svg) ### Attempt to directly activate conflicting Flight 1 test step @@ -144,8 +237,8 @@ per **[astm.f3548.v21.SCD0045](../../../../../requirements/astm/f3548/v21.md)**. #### [Validate Flight 1 not shared](../../validate_not_shared_operational_intent.md) Flight 1 should not have been shared with the interoperability ecosystem since it was rejected. -## Attempt to modify planned flight into conflict test case -![Test case summary illustration](assets/attempt_to_modify_planned_flight_into_conflict.svg) +## Attempt to modify planned flight into conflict with activated flight test case +![Test case summary illustration](assets/attempt_to_modify_planned_flight_into_conflict_with_activated_flight.svg) ### Plan Flight 1c test step @@ -171,8 +264,8 @@ As such the change to Flight 1c should be rejected per **[astm.f3548.v21.SCD0040 Because the modification attempt was invalid, either Flight 1c should not have been modified (because the USS kept the original accepted request), or it should have been removed (because the USS rejected the replacement plan provided). -## Attempt to modify activated flight into conflict test case -![Test case summary illustration](assets/attempt_to_modify_activated_flight_into_conflict.svg) +## Attempt to modify activated flight into conflict with activated flight test case +![Test case summary illustration](assets/attempt_to_modify_activated_flight_into_conflict_with_activated_flight.svg) ### Activate Flight 1c test step diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py index ad0c2a1d5a..8f7b10a873 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py @@ -151,19 +151,59 @@ def __init__( ) def run_planning_sequence(self, context: ExecutionContext): - self.begin_test_case("Attempt to plan flight into conflict") - self._attempt_plan_flight_conflict() + self.begin_test_case("Attempt to plan flight into conflict with planned flight") + self._attempt_plan_flight_conflict(activate_flight2=False) self.end_test_case() - self.begin_test_case("Attempt to activate flight into conflict") + self.begin_test_case( + "Attempt to activate flight into conflict with planned flight" + ) + self._attempt_activate_flight_conflict() + self.end_test_case() + + self.begin_test_case( + "Attempt to modify planned flight into conflict with planned flight" + ) + flight_1_oi_ref = self._attempt_modify_planned_flight_conflict() + self.end_test_case() + + self.begin_test_case( + "Attempt to modify activated flight into conflict with planned flight" + ) + self._attempt_modify_activated_flight_conflict(flight_1_oi_ref) + if self.flight1_id is not None: + self.begin_test_step("Delete Flight 1c") + delete_flight( + self, + self.tested_uss, + self.flight1_id, + flight_planning_state=self.flight_planning_state, + ) + self.flight1_id = None + self.end_test_step() + self.end_test_case() + + self.begin_test_case( + "Attempt to plan flight into conflict with activated flight" + ) + self._attempt_plan_flight_conflict(activate_flight2=True) + self.end_test_case() + + self.begin_test_case( + "Attempt to activate flight into conflict with activated flight" + ) self._attempt_activate_flight_conflict() self.end_test_case() - self.begin_test_case("Attempt to modify planned flight into conflict") + self.begin_test_case( + "Attempt to modify planned flight into conflict with activated flight" + ) flight_1_oi_ref = self._attempt_modify_planned_flight_conflict() self.end_test_case() - self.begin_test_case("Attempt to modify activated flight into conflict") + self.begin_test_case( + "Attempt to modify activated flight into conflict with activated flight" + ) flight_1_oi_ref = self._attempt_modify_activated_flight_conflict( flight_1_oi_ref ) @@ -173,7 +213,8 @@ def run_planning_sequence(self, context: ExecutionContext): self._modify_activated_flight_preexisting_conflict(flight_1_oi_ref) self.end_test_case() - def _attempt_plan_flight_conflict(self): + def _attempt_plan_flight_conflict(self, activate_flight2: bool): + self.begin_test_step("Plan Flight 2") flight2_planned = self.resolve_flight(self.equal_prio_flight2_planned) @@ -194,27 +235,28 @@ def _attempt_plan_flight_conflict(self): flight_2_oi_ref = validator.expect_shared(flight2_planned) self.end_test_step() - self.begin_test_step("Activate Flight 2") - flight2_activated = self.resolve_flight(self.equal_prio_flight2_activated) + if activate_flight2: + self.begin_test_step("Activate Flight 2") + flight2_activated = self.resolve_flight(self.equal_prio_flight2_activated) - with OpIntentValidator( - self, - self.control_uss, - self.dss, - flight2_activated, - flight_2_oi_ref, - ) as validator: - _, _, as_planned = activate_flight( + with OpIntentValidator( self, self.control_uss, + self.dss, flight2_activated, - self.flight2_id, - flight_planning_state=self.flight_planning_state, - ) - # TODO(#1326): Validate that flight as planned still allows this scenario to proceed - flight2_activated = as_planned - validator.expect_shared(flight2_activated) - self.end_test_step() + flight_2_oi_ref, + ) as validator: + _, _, as_planned = activate_flight( + self, + self.control_uss, + flight2_activated, + self.flight2_id, + flight_planning_state=self.flight_planning_state, + ) + # TODO(#1326): Validate that flight as planned still allows this scenario to proceed + flight2_activated = as_planned + validator.expect_shared(flight2_activated) + self.end_test_step() self.begin_test_step("Attempt to plan Flight 1") flight1_planned = self.resolve_flight(self.flight1_planned)