broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = {v:d for v,d in x['views'].items() if v!=x['closing']}
    r1 = sum(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items())
    r2 = not any(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items())
    r3 = x['subscriptions'][x['closing']]
    r4 = x['document_handles'][x['views'][x['closing']]] if not any(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items()) else 0
    r5 = []
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'e'}, 1, False, 2, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'a': 'd', 'b': 'd'}, 0, True, 1, 4, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4, 'f': 1}}, [{'b': 'e', 'c': 'f'}, 0, True, 2, 7, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'a': 'd', 'c': 'e'}, 1, False, 3, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'd'}, 2, False, 2, 0, ['b', 'c']])], 2: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'e'}, 1, False, 4, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'a': 'd', 'b': 'd'}, 0, True, 2, 8, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8, 'f': 2}}, [{'b': 'e', 'c': 'f'}, 0, True, 4, 14, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'a': 'd', 'c': 'e'}, 1, False, 6, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'd'}, 2, False, 4, 0, ['b', 'c']])], 3: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'e'}, 1, False, 6, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'a': 'd', 'b': 'd'}, 0, True, 3, 12, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12, 'f': 3}}, [{'b': 'e', 'c': 'f'}, 0, True, 6, 21, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'a': 'd', 'c': 'e'}, 1, False, 9, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'd'}, 2, False, 6, 0, ['b', 'c']])], 4: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'e'}, 1, False, 8, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'a': 'd', 'b': 'd'}, 0, True, 4, 16, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16, 'f': 4}}, [{'b': 'e', 'c': 'f'}, 0, True, 8, 28, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'a': 'd', 'c': 'e'}, 1, False, 12, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'd'}, 2, False, 8, 0, ['b', 'c']])], 5: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'e'}, 1, False, 10, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'a': 'd', 'b': 'd'}, 0, True, 5, 20, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20, 'f': 5}}, [{'b': 'e', 'c': 'f'}, 0, True, 10, 35, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'a': 'd', 'c': 'e'}, 1, False, 15, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'd'}, 2, False, 10, 0, ['b', 'c']])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = {v:d for v,d in x['views'].items() if v!=x['closing']}
    r1 = sum(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items())
    r2 = not any(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items())
    r3 = x['subscriptions'][x['closing']]
    r4 = x['document_handles'][x['views'][x['closing']]] if not any(v!=x['closing'] and d==x['views'][x['closing']] for v,d in x['views'].items()) else 0
    r5 = [v for v,d in x['views'].items() if d==x['views'][x['closing']]]
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'e'}, 1, False, 2, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'a': 'd', 'b': 'd'}, 0, True, 1, 4, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4, 'f': 1}}, [{'b': 'e', 'c': 'f'}, 0, True, 2, 7, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'a': 'd', 'c': 'e'}, 1, False, 3, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 2, 'b': 3, 'c': 1}, 'document_handles': {'d': 7, 'e': 4}}, [{'b': 'd', 'c': 'd'}, 2, False, 2, 0, ['b', 'c']])], 2: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'e'}, 1, False, 4, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'a': 'd', 'b': 'd'}, 0, True, 2, 8, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8, 'f': 2}}, [{'b': 'e', 'c': 'f'}, 0, True, 4, 14, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'a': 'd', 'c': 'e'}, 1, False, 6, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 4, 'b': 6, 'c': 2}, 'document_handles': {'d': 14, 'e': 8}}, [{'b': 'd', 'c': 'd'}, 2, False, 4, 0, ['b', 'c']])], 3: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'e'}, 1, False, 6, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'a': 'd', 'b': 'd'}, 0, True, 3, 12, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12, 'f': 3}}, [{'b': 'e', 'c': 'f'}, 0, True, 6, 21, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'a': 'd', 'c': 'e'}, 1, False, 9, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 6, 'b': 9, 'c': 3}, 'document_handles': {'d': 21, 'e': 12}}, [{'b': 'd', 'c': 'd'}, 2, False, 6, 0, ['b', 'c']])], 4: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'e'}, 1, False, 8, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'a': 'd', 'b': 'd'}, 0, True, 4, 16, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16, 'f': 4}}, [{'b': 'e', 'c': 'f'}, 0, True, 8, 28, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'a': 'd', 'c': 'e'}, 1, False, 12, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 8, 'b': 12, 'c': 4}, 'document_handles': {'d': 28, 'e': 16}}, [{'b': 'd', 'c': 'd'}, 2, False, 8, 0, ['b', 'c']])], 5: [({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'e'}, 1, False, 10, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'c', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'a': 'd', 'b': 'd'}, 0, True, 5, 20, []]), ({'views': {'a': 'd', 'b': 'e', 'c': 'f'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20, 'f': 5}}, [{'b': 'e', 'c': 'f'}, 0, True, 10, 35, []]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'a', 'subscriptions': {'a': 0, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'e'}, 1, False, 0, 0, ['b']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'e'}, 'closing': 'b', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'a': 'd', 'c': 'e'}, 1, False, 15, 0, ['a']]), ({'views': {'a': 'd', 'b': 'd', 'c': 'd'}, 'closing': 'a', 'subscriptions': {'a': 10, 'b': 15, 'c': 5}, 'document_handles': {'d': 35, 'e': 20}}, [{'b': 'd', 'c': 'd'}, 2, False, 10, 0, ['b', 'c']])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
The tab workspace reports an incorrect surviving sibling views.

Several tab views may share one document. Closing one view releases only its view resources and closes document resources only when no other view references that document.

split: open-access


meaning: Fixture-count band, not measured model difficulty

deps: stdlib

prompt:
The tab workspace reports an incorrect all view label update.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


prompt:
The tab workspace reports an incorrect renamed basename.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


prompt:
The tab workspace reports an incorrect document path update.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


prompt:
The tab workspace reports an incorrect rename retains view ids.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


prompt:
The tab workspace reports an incorrect rename retains dirty.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


prompt:
The tab workspace reports an incorrect rename retains active view.

Renaming an open document updates path and basename for every view of that document while retaining view IDs, dirty state and unrelated document labels.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = []
    r1 = [t for t in x['tabs'] if t in x['deleted'] and t in x['dirty']]
    r2 = [t for t in x['tabs'] if x['close_clean'] and t in x['deleted'] and t not in x['dirty']]
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = [t for t in x['tabs'] if t in x['deleted'] and t not in x['dirty']]
    r1 = [t for t in x['tabs'] if t in x['deleted'] and t in x['dirty']]
    r2 = [t for t in x['tabs'] if x['close_clean'] and t in x['deleted'] and t not in x['dirty']]
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
The tab workspace reports an incorrect missing tab badges.

External deletion leaves dirty tab buffers recoverable, marks missing backing files, permits Save As, and closes clean tabs only under the explicit close-clean policy.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = [t for t in x['tabs'] if t in x['deleted']]
    r1 = []
    r2 = [t for t in x['tabs'] if x['close_clean'] and t in x['deleted'] and t not in x['dirty']]
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = [t for t in x['tabs'] if t in x['deleted']]
    r1 = x['dirty']
    r2 = [t for t in x['tabs'] if x['close_clean'] and t in x['deleted'] and t not in x['dirty']]
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
The tab workspace reports an incorrect recoverable dirty buffers.

External deletion leaves dirty tab buffers recoverable, marks missing backing files, permits Save As, and closes clean tabs only under the explicit close-clean policy.

split: open-access


broken_source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = [t for t in x['tabs'] if t in x['deleted']]
    r1 = [t for t in x['tabs'] if t in x['deleted'] and t in x['dirty']]
    r2 = x['deleted']
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

source:
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    r0 = [t for t in x['tabs'] if t in x['deleted']]
    r1 = [t for t in x['tabs'] if t in x['deleted'] and t in x['dirty']]
    r2 = [t for t in x['tabs'] if t in x['deleted'] and t not in x['dirty']]
    r3 = {t:x['paths'][t].rsplit('/',1)[-1] for t in x['tabs'] if t in x['deleted'] and t in x['dirty']}
    r4 = [t for t in x['tabs'] if not (x['close_clean'] and t in x['deleted'] and t not in x['dirty'])]
    r5 = {t:x['paths'][t]+' (missing)' for t in x['tabs'] if t in x['deleted']}
    return [r0,r1,r2,r3,r4,r5]
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = {1: [({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c'], {}]), ({'tabs': ['a', 'b', 'c'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 2: [({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0'], {}]), ({'tabs': ['a', 'b', 'c', 'background0'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 3: [({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 4: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])], 5: [({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], ['a'], {'b': 'b.txt'}, ['b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['b'], 'close_clean': False, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['b'], [], {'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': ['a', 'b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], ['a', 'b'], [], {'a': 'a.txt', 'b': 'b.txt'}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['c'], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['c'], [], ['c'], {}, ['a', 'b', 'background0', 'background1', 'background2', 'background3'], {'c': '/project/c.txt (missing)'}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': [], 'dirty': ['b'], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [[], [], [], {}, ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], {}]), ({'tabs': ['a', 'b', 'c', 'background0', 'background1', 'background2', 'background3'], 'deleted': ['a', 'b'], 'dirty': [], 'close_clean': True, 'paths': {'a': '/project/a.txt', 'b': '/project/b.txt', 'c': '/project/c.txt'}}, [['a', 'b'], [], ['a', 'b'], {}, ['c', 'background0', 'background1', 'background2', 'background3'], {'a': '/project/a.txt (missing)', 'b': '/project/b.txt (missing)'}])]}
for i, (inputs, expected) in enumerate(fixtures[N]):
    check("workspace regression "+str(i), solve(inputs), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)

prompt:
The tab workspace reports an incorrect policy controlled closures.

External deletion leaves dirty tab buffers recoverable, marks missing backing files, permits Save As, and closes clean tabs only under the explicit close-clean policy.

split: open-access