authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 02:17:48-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-09-08 02:17:48-07:00
loge3fba00fa7baf2a33af4943802256e937ba0573d
tree4bef4307add284b5f3293f525722433ff2b43a64
parent5f00c02e9903b23fca73277fcdd3b6aa4fe2ea5a
signature Signed by SSH key SHA256:52mNGHRsVFBDED9IAX5pe+LRWUefqTbxEReunq21QvU

test: capture native join inheritance and tag semantics

Record five keyboard-driven OneNote joins covering differing paragraph styles, tagged empty text, right-side tags and children on both sides. Preserve native identity, hierarchy, tag-transfer and metadata observations in public fixtures. The native document oracle passes six pages before and after joining, and all characters plus 2,180 style comparisons survive. The complete Python lane passes 129 tests; all owned VMs were removed. Assisted-by: gpt-6-astra

45 files changed, 465 insertions(+), 0 deletions(-)

corpus/paragraph-edit/README.md+11
......@@ -37,3 +37,14 @@ typing checks extend the preexisting empty run in an independent expected model.
3737`tools/test_paragraph_edit.py` verifies these controls without a VM. The native
3838join captures establish behavior for subsequent join implementation.
3939Identical captured files link to one canonical copy within this corpus.
40
41`join-edges`, authored with `tools/native/paragraph-joins.ps1`, adds five native
42Backspace cases for differing inherited styles, tags on either side and children
43on both sides. A nonempty left paragraph keeps its own tags; right-only tags
44disappear from the active result. An empty tagged left paragraph transfers its
45tags onto the adopted right text. A left paragraph with children joins through
46its last descendant, and the right children become that descendant's peers.
47The untouched parent's text gains a timestamp and `0x880034dd`, as in the earlier
48native controls; its content and other properties stay unchanged. The test fixes
49these observed graph, identity and metadata effects alongside independent native
50character-style comparisons.
corpus/paragraph-edit/join-edges/before/notebook/Open Notebook.onetoc2 created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/before/notebook/Open Notebook.onetoc2 differ
corpus/paragraph-edit/join-edges/before/notebook/synthetic.one created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/before/notebook/synthetic.one differ
corpus/paragraph-edit/join-edges/before/read/environment.json created+7
......@@ -0,0 +1,7 @@
1{
2 "powershell": "5.1.14409.1005",
3 "schema": "xs2010",
4 "hostname": "ONE-M6-680BB09B",
5 "cold": false,
6 "onenote": "14.0.4763.1000"
7}
corpus/paragraph-edit/join-edges/before/read/hierarchy.xml created+2
......@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{22D0E791-FDA6-42CE-AF2A-16373B9BE3F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T09:08:50.000Z" color="#B49EDE"><one:Section name="synthetic" ID="{A9716841-ED4F-0F89-335D-AA1487991C1C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T09:08:50.000Z" color="#8AA8E4"><one:Page ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/></one:Section></one:Notebook>
corpus/paragraph-edit/join-edges/before/read/page-000.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join empty left tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span
4style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span
5style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/page-001.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both children]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.921875" height="67.13858032226562"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{45}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span
4style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span
5style='color:#123456' lang=x-none>tail</span>]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{58}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{63}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/page-002.xml created+4
......@@ -0,0 +1,4 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:QuickStyleDef index="1" name="h1" fontColor="#123456" highlightColor="automatic" font="Georgia" fontSize="18.0" bold="true" spaceBefore="8.0" spaceAfter="4.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join inherited styles]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="143.3818817138672" height="479.3075256347656"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{B0}" alignment="left" spaceBefore="288.0" spaceAfter="144.0" quickStyleIndex="1"><one:T><![CDATA[<span
3style='font-weight:bold'>Right </span><span style='font-weight:bold;font-style:
4italic'>italic</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:07:15.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/page-003.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both tags]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span
4style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span
5style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:07:17.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/page-004.xml created+20
......@@ -0,0 +1,20 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="127.5136947631836" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E5919B8C-DC8C-0424-0B9C-4D544F569794}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/page-005.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join right tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:07:18.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="40.28315734863281"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span
4style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span
5style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:07:16.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/before/read/payloads.json created+1
......@@ -0,0 +1 @@
1../../../before/read/payloads.json
\ No newline at end of file
corpus/paragraph-edit/join-edges/cases.json created+27
......@@ -0,0 +1,27 @@
1[
2 {
3 "body": "\u003cone:OE quickStyleIndex=\"0\"\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE quickStyleIndex=\"1\"\u003e\u003cone:T\u003e\u003c![CDATA[Right \u003ci\u003eitalic\u003c/i\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e",
4 "name": "Join inherited styles",
5 "page": "{E046973C-CAEF-4B56-BEA4-93E05E43212A}{1}{B0}"
6 },
7 {
8 "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e",
9 "name": "Join empty left tag",
10 "page": "{C06F80E1-9B07-4035-B55C-3144C1873BD1}{1}{B0}"
11 },
12 {
13 "body": "\u003cone:OE\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e",
14 "name": "Join right tag",
15 "page": "{3266A6F4-4313-4C8D-8103-7D8EC811E889}{1}{B0}"
16 },
17 {
18 "body": "\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:Tag index=\"0\" completed=\"true\" disabled=\"false\" creationDate=\"2020-01-02T03:04:05.000Z\" completionDate=\"2020-01-02T04:05:06.000Z\"/\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003c/one:OE\u003e",
19 "name": "Join both tags",
20 "page": "{55922D45-C0E9-41E5-BCE7-ECBE10331C71}{1}{B0}"
21 },
22 {
23 "body": "\u003cone:OE\u003e\u003cone:T\u003eLeft \u003c/one:T\u003e\u003cone:OEChildren\u003e\u003cone:OE\u003e\u003cone:T\u003eLeft child\u003c/one:T\u003e\u003c/one:OE\u003e\u003c/one:OEChildren\u003e\u003c/one:OE\u003e\u003cone:OE\u003e\u003cone:T\u003e\u003c![CDATA[\u003cb\u003eBold\u003c/b\u003e \u003ci\u003eitalic\u003c/i\u003e 🦀 é \u003cspan style=\"color:#123456\"\u003etail\u003c/span\u003e]]\u003e\u003c/one:T\u003e\u003cone:OEChildren\u003e\u003cone:OE\u003e\u003cone:T\u003eRight child\u003c/one:T\u003e\u003c/one:OE\u003e\u003c/one:OEChildren\u003e\u003c/one:OE\u003e",
24 "name": "Join both children",
25 "page": "{E151A4C0-B88B-4EFD-8F87-D3269DE420CD}{1}{B0}"
26 }
27]
corpus/paragraph-edit/join-edges/joined/notebook/Open Notebook.onetoc2 created+1
......@@ -0,0 +1 @@
1../../before/notebook/Open Notebook.onetoc2
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/notebook/synthetic.one created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/notebook/synthetic.one differ
corpus/paragraph-edit/join-edges/joined/read/environment.json created+1
......@@ -0,0 +1 @@
1../../before/read/environment.json
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/read/hierarchy.xml created+2
......@@ -0,0 +1,2 @@
1<?xml version="1.0"?>
2<one:Notebook xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" name="notebook" nickname="notebook" ID="{22D0E791-FDA6-42CE-AF2A-16373B9BE3F9}{1}{B0}" path="C:\one-tests\runs\capture\notebook" lastModifiedTime="2026-09-08T09:09:35.000Z" color="#B49EDE" isCurrentlyViewed="true"><one:Section name="synthetic" ID="{A9716841-ED4F-0F89-335D-AA1487991C1C}{1}{B0}" path="C:\one-tests\runs\capture\notebook\synthetic.one" lastModifiedTime="2026-09-08T09:09:35.000Z" color="#8AA8E4" isCurrentlyViewed="true"><one:Page ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:08:50.000Z" pageLevel="1"/><one:Page ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" pageLevel="1"/><one:Page ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" pageLevel="1"/><one:Page ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:32.000Z" pageLevel="1"/><one:Page ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" pageLevel="1"/><one:Page ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" pageLevel="1" isCurrentlyViewed="true"/></one:Section></one:Notebook>
corpus/paragraph-edit/join-edges/joined/read/page-000.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}" name="Join empty left tag" dateTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:29.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join empty left tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:30.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="116.9218902587891" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:30.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3style='font-weight:bold' lang=en-US>Bold</span><span lang=en-US> </span><span
4style='font-style:italic' lang=en-US>italic</span><span lang=en-US> &#129408; é </span><span
5style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:29.000Z" objectID="{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{55}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/page-001.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}" name="Join both children" dateTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" pageLevel="1" isCurrentlyViewed="true" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both children]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="184.8066253662109" height="53.71086883544922"/><one:OEChildren><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Left]]></one:T><one:OEChildren><one:OE creationTime="2026-09-08T09:09:35.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{45}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span
3lang=en-US>Left child</span><span style='font-weight:bold' lang=en-US>Bold</span><span
4lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span
5lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{58}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Right child]]></one:T></one:OE></one:OEChildren></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:35.000Z" objectID="{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{63}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/page-002.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}" name="Join inherited styles" dateTime="2026-09-08T09:07:14.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join inherited styles]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="160.521011352539" height="33.87984466552734"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:28.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span style='font-family:Calibri;
3font-size:11.0pt'>Left</span><span style='font-weight:bold;font-family:Georgia;
4font-size:18.0pt;color:#123456'>Right </span><span style='font-weight:bold;
5font-style:italic;font-family:Georgia;font-size:18.0pt;color:#123456'>italic</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:15.000Z" lastModifiedTime="2026-09-08T09:09:28.000Z" objectID="{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/page-003.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}" name="Join both tags" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" pageLevel="1" lang="en-US"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join both tags]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="134.0610046386719" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:33.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{40}{B0}" alignment="left" quickStyleIndex="0"><one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/><one:T><![CDATA[<span
3lang=en-US>Left</span><span style='font-weight:bold' lang=en-US>Bold</span><span
4lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span
5lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:17.000Z" lastModifiedTime="2026-09-08T09:09:33.000Z" objectID="{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/page-004.xml created+20
......@@ -0,0 +1,20 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{85389BC7-6484-4C98-B43A-02857BA10003}{1}{B0}" name="Bold 🦀 italic é color 東京" dateTime="2026-09-05T05:06:54.000Z" lastModifiedTime="2026-09-08T09:09:26.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Outline author="Rich author" lastModifiedBy="Rich author" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{10}{B0}"><one:Position x="36.0" y="14.40000057220459" z="0"/><one:Size width="523.125" height="42.90299224853515"/><one:OEChildren><one:OE creationTime="2026-09-08T04:47:24.000Z" lastModifiedTime="2026-09-08T04:47:24.000Z" objectID="{E5919B8C-DC8C-0424-0B9C-4D544F569794}{1}{B0}" alignment="left"><one:T><![CDATA[<span style='font-weight:bold;
3text-decoration:underline;font-family:Calibri;font-size:11.0pt'>Bold</span><span
4style='font-family:Calibri;font-size:11.0pt'> </span><span style='font-family:
5Arial;font-size:13.5pt'>&#129408;</span><span style='font-family:Calibri;
6font-size:11.0pt'> </span><span style='font-style:italic;text-decoration:line-through;
7font-family:Calibri;font-size:11.0pt'>italic</span><span style='font-family:
8Calibri;font-size:11.0pt'> </span><span style='vertical-align:super;font-family:
9Calibri;font-size:11.0pt'>é</span><span style='font-family:Calibri;font-size:
1011.0pt'> </span><span style='font-family:Calibri;font-size:11.0pt;color:#0C2238;
11background:yellow;mso-highlight:yellow'>color</span><span style='font-family:
12Calibri;font-size:11.0pt'> </span><span style='vertical-align:sub;font-family:
13Calibri;font-size:11.0pt'>東京</span><span style='font-family:Calibri;font-size:
1411.0pt'><br>
15End</span>]]></one:T></one:OE><one:OE author="snow" authorInitials="S" lastModifiedBy="snow" lastModifiedByInitials="S" creationTime="2026-09-05T05:06:55.000Z" lastModifiedTime="2026-09-05T05:06:56.000Z" objectID="{E2F4337B-2FF1-4F2E-BBC8-8E5E843DE562}{11}{B0}" alignment="left" quickStyleIndex="0" style="font-size:11.0pt;color:#1F4E79"><one:T><![CDATA[<span
16style='font-weight:bold;font-family:Calibri' lang=en-US>Fictitious: café, </span><span
17style='font-weight:bold;font-family:SimSun' lang=en-US>東京</span><span
18style='font-weight:bold;font-family:Calibri' lang=en-US>, </span><span
19style='font-weight:bold;font-family:Arial;direction:rtl;unicode-bidi:embed'
20lang=ar-SA>مرحبا</span>]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/page-005.xml created+5
......@@ -0,0 +1,5 @@
1<?xml version="1.0"?>
2<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}" name="Join right tag" dateTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:32.000Z" pageLevel="1" lang="en-US"><one:QuickStyleDef index="0" name="p" fontColor="automatic" highlightColor="automatic" font="Calibri" fontSize="11.0" spaceBefore="0.0" spaceAfter="0.0"/><one:PageSettings RTL="false" color="automatic"><one:PageSize><one:Automatic/></one:PageSize><one:RuleLines visible="false"/></one:PageSettings><one:Title lang="en-US"><one:OE author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:31.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{33}{B0}" alignment="left" quickStyleIndex="0" style="font-family:Calibri;font-size:17.0pt"><one:T><![CDATA[Join right tag]]></one:T></one:OE></one:Title><one:Outline author="virtual" authorInitials="V" lastModifiedBy="virtual" lastModifiedByInitials="V" lastModifiedTime="2026-09-08T09:09:32.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{39}{B0}"><one:Position x="72.0" y="108.0" z="0"/><one:Size width="134.0610046386719" height="26.85543441772461"/><one:OEChildren><one:OE creationTime="2026-09-08T09:09:32.000Z" lastModifiedTime="2026-09-08T09:09:32.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{40}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[<span
3lang=en-US>Left</span><span style='font-weight:bold' lang=en-US>Bold</span><span
4lang=en-US> </span><span style='font-style:italic' lang=en-US>italic</span><span
5lang=en-US> &#129408; é </span><span style='color:#123456' lang=x-none>tail</span>]]></one:T></one:OE><one:OE creationTime="2026-09-08T09:07:16.000Z" lastModifiedTime="2026-09-08T09:09:31.000Z" objectID="{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{54}{B0}" alignment="left" quickStyleIndex="0"><one:T><![CDATA[Preserved sibling]]></one:T></one:OE></one:OEChildren></one:Outline></one:Page>
corpus/paragraph-edit/join-edges/joined/read/payloads.json created+1
......@@ -0,0 +1 @@
1../../../before/read/payloads.json
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.ahk created+22
......@@ -0,0 +1,22 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}", "{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
21Sleep 300
22Send "{Left}{Backspace}"
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.json created+13
......@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Join both children - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-both-children.png created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-both-children.png differ
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.ahk created+22
......@@ -0,0 +1,22 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}", "{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
21Sleep 300
22Send "{Left}{Backspace}"
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.json created+13
......@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Join both tags - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.png created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-both-tags.png differ
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.ahk created+22
......@@ -0,0 +1,22 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}", "{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
21Sleep 300
22Send "{Left}{Backspace}"
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.json created+13
......@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Join empty left tag - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.png created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-empty-left-tag.png differ
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.ahk created+22
......@@ -0,0 +1,22 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}", "{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
21Sleep 300
22Send "{Left}{Backspace}"
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.json created+13
......@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Join inherited styles - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.png created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-inherited-styles.png differ
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.ahk created+22
......@@ -0,0 +1,22 @@
1#Requires AutoHotkey v2.0
2OnError((exception, mode) => (FileAppend(exception.Message, "**"), ExitApp(1)))
3dm := Buffer(220, 0)
4NumPut("UShort", 220, dm, 68)
5if !DllCall("EnumDisplaySettingsW", "Ptr", 0, "UInt", 0xFFFFFFFF, "Ptr", dm)
6 throw Error("Cannot inspect display mode")
7NumPut("UInt", NumGet(dm, 72, "UInt") | 0x180000, dm, 72)
8NumPut("UInt", 1280, dm, 172)
9NumPut("UInt", 720, dm, 176)
10if DllCall("ChangeDisplaySettingsW", "Ptr", dm, "UInt", 0, "Int") != 0
11 throw Error("Display mode rejected")
12app := ComObject("OneNote.Application")
13app.NavigateTo("{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}", "{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{B0}", false)
14hwnd := WinWait("ahk_class Framework::CFrame ahk_exe ONENOTE.EXE",, 10)
15if !hwnd
16 throw Error("OneNote window did not appear")
17WinMaximize(hwnd)
18WinActivate(hwnd)
19if !WinWaitActive(hwnd,, 10)
20 throw Error("OneNote window did not become active")
21Sleep 300
22Send "{Left}{Backspace}"
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.json created+13
......@@ -0,0 +1,13 @@
1{
2 "exit": 0,
3 "stdout": "",
4 "stderr": "",
5 "w": 1280,
6 "h": 720,
7 "error": null,
8 "win": {
9 "title": "Join right tag - Microsoft OneNote",
10 "class": "Framework::CFrame",
11 "dialog": false
12 }
13}
\ No newline at end of file
corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.png created
Binary files /dev/null and b/corpus/paragraph-edit/join-edges/joined/ui/join-right-tag.png differ
corpus/paragraph-edit/join-edges/joined/ui/selections.json created+32
......@@ -0,0 +1,32 @@
1[
2 {
3 "case": "Join inherited styles",
4 "page": "{37EE141E-FB2A-431D-A9A3-63CC93249D1D}{1}{B0}",
5 "object": "{F1B58AF6-82D4-4DC3-8AA6-D7E96816F6B8}{46}{B0}",
6 "keys": "{Left}{Backspace}"
7 },
8 {
9 "case": "Join empty left tag",
10 "page": "{17C703C3-AAC2-487E-A25B-C1680CE087E6}{1}{B0}",
11 "object": "{6A8F6379-AECA-4275-B007-DDA813F1CDA8}{47}{B0}",
12 "keys": "{Left}{Backspace}"
13 },
14 {
15 "case": "Join right tag",
16 "page": "{E5CE25D6-72D6-44C6-9604-8DA2057654BE}{1}{B0}",
17 "object": "{CFBA859A-3493-4F22-86CF-0EEDA377AB77}{45}{B0}",
18 "keys": "{Left}{Backspace}"
19 },
20 {
21 "case": "Join both tags",
22 "page": "{823AAE67-F12C-49AE-ABE0-1C92DD54A046}{1}{B0}",
23 "object": "{9B7130D0-DD0F-4C6F-963D-61C5A203C4F9}{46}{B0}",
24 "keys": "{Left}{Backspace}"
25 },
26 {
27 "case": "Join both children",
28 "page": "{36F927E2-894E-46B6-9880-230A50839CFA}{1}{B0}",
29 "object": "{E2A450C5-7596-4142-BBC7-E4EDC8853D7E}{50}{B0}",
30 "keys": "{Left}{Backspace}"
31 }
32]
\ No newline at end of file
corpus/paragraph-edit/join-edges/run.json created+19
......@@ -0,0 +1,19 @@
1{
2 "notebook": "/Users/clo/dev/one/corpus/formatted-insertion/native-paragraph/candidate",
3 "expected_pages": 6,
4 "author": "evidence/m10/native-paragraph-edges.ps1",
5 "author_timeout_seconds": 600,
6 "inspect": true,
7 "collect_notebook": true,
8 "base": {
9 "file": "win7-office-base.qcow2",
10 "format": "qcow2",
11 "sha256": "a1a4f8fab782ee14885ff801ca2f6347c208fdcfc3513637096f314315c89346",
12 "virtual_size": 68719476736
13 },
14 "scripts": {
15 "author.ps1": "9c9f9f172794e7be6aeee910731ac50d0db8130799ced1bcc8f4f5c4a37a4932",
16 "cold.ps1": "c177fc72ae6c2634d186f5671a880de20b09f9716532c37c69cb13aa15c7e331",
17 "read.ps1": "04013bfcccee40a17e2a225f9b9e96f40a3a8daad9e350609654f8eda3ccbb41"
18 }
19}
corpus/paragraph-edit/join-edges/source.json created+1
......@@ -0,0 +1 @@
1../split/source.json
\ No newline at end of file
corpus/paragraph-edit/join-edges/teardown.json created+1
......@@ -0,0 +1 @@
1../joined/teardown.json
\ No newline at end of file
tools/native/paragraph-joins.ps1 created+40
......@@ -0,0 +1,40 @@
1param([Parameter(Mandatory=$true)][string]$Root, [Parameter(Mandatory=$true)][string]$CloneHost)
2Set-StrictMode -Version Latest
3$ErrorActionPreference = 'Stop'
4& "$PSScriptRoot\cold-current.ps1" -Root $Root -CloneHost $CloneHost
5$app = New-Object -ComObject OneNote.Application
6$notebook = ''
7try {
8 $app.OpenHierarchy((Join-Path $Root 'notebook'), '', [ref]$notebook, 0)
9 $section = ''
10 $app.OpenHierarchy('synthetic.one', $notebook, [ref]$section, 0)
11 $mixed = '<b>Bold</b> <i>italic</i> ' + [char]::ConvertFromUtf32(0x1F980) + ' e' + [char]0x0301 + ' <span style="color:#123456">tail</span>'
12 $text = '<one:T><![CDATA[' + $mixed + ']]></one:T>'
13 $child = '<one:OEChildren><one:OE><one:T>Preserved child</one:T></one:OE></one:OEChildren>'
14 $tag = '<one:Tag index="0" completed="true" disabled="false" creationDate="2020-01-02T03:04:05.000Z" completionDate="2020-01-02T04:05:06.000Z"/>'
15 $cases = @(
16 @{ name = 'Join inherited styles'; body = '<one:OE quickStyleIndex="0"><one:T>Left </one:T></one:OE><one:OE quickStyleIndex="1"><one:T><![CDATA[Right <i>italic</i>]]></one:T></one:OE>' },
17 @{ name = 'Join empty left tag'; body = '<one:OE>' + $tag + '<one:T><![CDATA[]]></one:T></one:OE><one:OE>' + $text + '</one:OE>' },
18 @{ name = 'Join right tag'; body = '<one:OE><one:T>Left </one:T></one:OE><one:OE>' + $tag + $text + '</one:OE>' },
19 @{ name = 'Join both tags'; body = '<one:OE>' + $tag + '<one:T>Left </one:T></one:OE><one:OE>' + $tag + $text + '</one:OE>' },
20 @{ name = 'Join both children'; body = '<one:OE><one:T>Left </one:T><one:OEChildren><one:OE><one:T>Left child</one:T></one:OE></one:OEChildren></one:OE><one:OE>' + $text + '<one:OEChildren><one:OE><one:T>Right child</one:T></one:OE></one:OEChildren></one:OE>' }
21 )
22 $inputs = Join-Path $Root 'inputs'
23 New-Item -ItemType Directory -Path $inputs | Out-Null
24 foreach ($case in $cases) {
25 $page = ''
26 $app.CreateNewPage($section, [ref]$page, 0)
27 $xml = '<one:Page xmlns:one="http://schemas.microsoft.com/office/onenote/2010/onenote" ID="' + $page + '"><one:TagDef index="0" type="0" symbol="3" fontColor="automatic" highlightColor="none" name="Fixture task"/><one:QuickStyleDef index="0" name="p" font="Calibri" fontSize="11" fontColor="automatic" highlightColor="automatic"/><one:QuickStyleDef index="1" name="h1" font="Georgia" fontSize="18" bold="true" fontColor="#123456" highlightColor="automatic" spaceBefore="8" spaceAfter="4"/><one:Title><one:OE><one:T>' + $case.name + '</one:T></one:OE></one:Title><one:Outline><one:Position x="72" y="108"/><one:OEChildren>' + $case.body + '<one:OE><one:T>Preserved sibling</one:T></one:OE></one:OEChildren></one:Outline></one:Page>'
28 [IO.File]::WriteAllText((Join-Path $inputs ($case.name + '.xml')), $xml, [Text.Encoding]::UTF8)
29 $app.UpdatePageContent($xml, [DateTime]::MinValue, 1, $true)
30 $case.page = $page
31 }
32 $cases | ConvertTo-Json -Depth 6 | Set-Content (Join-Path $Root 'cases.json') -Encoding UTF8
33 $app.SyncHierarchy($notebook)
34} finally {
35 if ($notebook) { $app.CloseNotebook($notebook, $false) }
36 [void][Runtime.InteropServices.Marshal]::FinalReleaseComObject($app)
37 $app = $null
38 [GC]::Collect()
39 [GC]::WaitForPendingFinalizers()
40}
tools/test_paragraph_edit.py+55
......@@ -17,6 +17,61 @@ compare = runpy.run_path(str(ROOT / 'tools/verify-document.py'))['compare']
1717
1818
1919class ParagraphEditTest(unittest.TestCase):
20 def test_native_joins_preserve_inherited_styles_and_follow_tag_and_child_rules(self):
21 fixture = FIXTURE / 'join-edges'
22 models, captures = {}, {}
23 with TemporaryDirectory() as temporary:
24 for phase in ('before', 'joined'):
25 folder = Path(temporary) / phase
26 shutil.copytree(fixture / phase / 'read', folder / 'read')
27 compare(fixture / phase / 'notebook', folder / 'read')
28 subprocess.run([EXPORTER, fixture / phase / 'notebook/synthetic.one', folder / 'model'], check=True)
29 model = json.loads((folder / 'model/document.json').read_text())
30 models[phase] = {r['nodes'][r['roots']['2']]['kind']['title']: (r, page)
31 for _, _, r, page in ordered_pages(model)}
32 captures[phase] = {}
33 for path in (folder / 'read').glob('page-*.xml'):
34 page = ET.parse(path).getroot()
35 captures[phase][page.get('name')] = native_characters(page, page.findall('one:Outline', ns))
36 self.assertEqual(len(models[phase]), 6)
37 cases = json.loads((fixture / 'cases.json').read_text(encoding='utf-8-sig'))
38 self.assertEqual(len(cases), 5)
39 for case in cases:
40 name = case['name']
41 with self.subTest(case=name):
42 old, page = models['before'][name]
43 new, new_page = models['joined'][name]
44 self.assertEqual(page, new_page)
45 outline, = [oid for oid in old['nodes'][page]['children'] if old['nodes'][oid]['kind']['type'] == 'Outline']
46 left, right, sibling = old['nodes'][outline]['children']
47 self.assertEqual(new['nodes'][outline]['children'], [left, sibling])
48 target = old['nodes'][left]['children'][-1] if name == 'Join both children' else left
49 a, = old['nodes'][target]['content']
50 b, = old['nodes'][right]['content']
51 empty = old['nodes'][a]['kind']['text'] == ''
52 survivor = b if empty else a
53 self.assertEqual(new['nodes'][target]['content'], [survivor])
54 self.assertEqual(new['nodes'][survivor]['kind']['text'], old['nodes'][a]['kind']['text'] + old['nodes'][b]['kind']['text'])
55 self.assertEqual(new['nodes'][survivor]['tags'], old['nodes'][a]['tags'])
56 children = old['nodes'][left]['children'] + old['nodes'][right]['children']
57 self.assertEqual(new['nodes'][left]['children'], children)
58 self.assertEqual(new['nodes'][sibling], old['nodes'][sibling])
59 if name == 'Join both children':
60 parent_text, = old['nodes'][left]['content']
61 original = old['nodes'][parent_text]
62 current = new['nodes'][parent_text]
63 self.assertGreater(current['modified'], original['modified'])
64 expected = {**original, 'modified': current['modified'],
65 'extra': [original['extra'][0] + [{'id': 0x880034dd, 'value': 'NoData'}]]}
66 self.assertEqual(current, expected)
67 before = [v for paragraph in captures['before'][name] for v in paragraph]
68 after = [v for paragraph in captures['joined'][name] for v in paragraph]
69 for (a, old_style), (b, new_style) in zip(before, after, strict=True):
70 self.assertEqual(a, b)
71 for key in old_style.keys() | new_style.keys():
72 default = 'automatic' if key in ('color', 'highlight') else False
73 self.assertEqual(old_style.get(key, default), new_style.get(key, default))
74
2075 def test_rust_splits_match_native_controls_and_preserve_empty_typing_styles(self):
2176 fixture = FIXTURE / 'rust-split'
2277 manifest = json.loads((fixture / 'manifest.json').read_text())