7aba31f14aed7f2620e4746b54f9569a5c93e1ad
braney
Sat Sep 12 15:07:34 2026 -0700
docent: ten regression tests for quickLift, on hgTracks and on hgc, refs #38252
Fourteen scripts here already lift something -- they are the ones that call
`convert: {quicklift: true}` -- so these take the parts of the lift that had no
test. Five read the lifted image and five read a details page:
rm38032 the target keeps the source's track order. First use of `ordered:`,
which was added to expect: for this bug
rm38042 a ClinVar CNV running past the chains quickLift loads is clipped
rather than dropped, so the spanned-item merge still has it
rm37646 a lolly composite subtrack lifts, and its map boxes still carry its
own track name -- the string the stale pop pointer clobbered
rm36048 the spanned-item merge still works on a lifted DECIPHER track
rm37815 "Hide all default tracks on the target" hides all six of hs1's own
tracks and keeps the lifted one
rm36059 a lifted GENCODE Versions item gives the real details page, in
destination coordinates, with no "Can't start query"
rm36370 a lifted knownGene click renders GeneReviews and Methods, the two
sections the ticket says were missing
rm36125 a lifted RefSeq item's page, and its Predicted Protein link
returning SHH's peptide instead of a blank page
rm36942 the Alignment Differences description, reached from a difference
item: the four colors and the figure
rm38146 the same page with a GenArk assembly as the SOURCE, down to the base
alignment that reads query bases out of a two bit file
All ten are assertion-only: every fix shipped long ago. make test is 57 of 57
green in 10m18s, up from 7m34s -- each script costs a convert, about 17 seconds,
because no URL builds a quickLift hub.
README.txt gains what the batch cost. A lifted row and map box carry a per-run
hub_<n>_ prefix, so rows: matches by suffix and a has: selector must use a
substring. Never assert a count an otto reload can move: rm38042 and rm36048
both read the merged-item box and leave its count (45 for ClinVar today) to a
comment. And a details page prints the track's own labels whether or not it
worked, so each hgc assertion names something only the fixed page has.
Three candidates were rejected: #38033's "(N items could not be lifted)" label
is only in the drawn image and the page JSON, where no expect: check reaches it;
#37970 needs a broadPeak track and hg38 has none; #37974's center-label drag is
pixels.
diff --git src/hg/utils/docent/tests/regress/rm38032.docent.yaml src/hg/utils/docent/tests/regress/rm38032.docent.yaml
new file mode 100644
index 00000000000..a1219577e5b
--- /dev/null
+++ src/hg/utils/docent/tests/regress/rm38032.docent.yaml
@@ -0,0 +1,53 @@
+# #38032 -- tracks came out on the target assembly in a different order than they had on
+# the source. Lifting the ClinVar container swapped the copy-number row and the
+# submitted-interpretations row, and a track lifted in a later request always sorted below
+# one lifted earlier no matter where it sat on the source.
+#
+# Two commits, and the second is the one this asserts. cdb3401bc60 stopped the hub writer
+# handing out a counter in walk order and carried each track's source priority into its hub
+# stanza instead. That was not enough: c2f76c53033 found that trackHubAddGroupName rewrites
+# every hub track's group to the hub's own name, so all lifted tracks land in one QuickLift
+# group and priorities from different source groups are then compared against each other.
+# Its example is the pair used here -- MANE is priority 100 in the genes group and
+# wgEncodeRegDnaseWig is 1.8 in regulation, the group puts MANE on top on hg38, and the raw
+# priority put it at the bottom on the target. The fix writes each track's RANK in the list
+# the caller has already sorted, so the target orders on how the source is laid out.
+#
+# `ordered: true` was added to expect: for this bug (074123ba2fb), and this is the first
+# script to use it. The two tracks are asserted in order on the source first, because
+# "the target matches the source" is only a claim about the target if the source order is
+# stated rather than assumed.
+#
+# `hideDefaults: true` on the convert keeps hs1's own default tracks off the target, so
+# `exact: true` can say the target holds these two and the chain and nothing else. See
+# rm37815, which is about that checkbox.
+proof:
+ - "assertion-only 2026-09-12 -- written from the ticket and from c2f76c53033, after the fix shipped"
+
+target: genome-test
+db: hg38
+position: chr7:155799529-155812871
+reset: true
+fast: true
+steps:
+ - go: chr7:155799529-155812871
+ - hide: all
+
+ # wgEncodeReg is a superTrack: hideKids keeps its other members off so the regulation
+ # side of the pair is one row.
+ - track: {mane: pack, wgEncodeReg: hideKids, wgEncodeRegDnaseWig: full}
+ - expect:
+ rows: [ruler, mane, wgEncodeRegDnaseWig]
+ ordered: true
+ exact: true
+
+ - convert: {to: hs1, quicklift: true, hideDefaults: true}
+ - open: lift
+
+ # The same two, the same way up. The synthetic Alignment Differences track
+ # (quickLiftChain) is added by hubConnect at the top and is not part of the source order.
+ - expect:
+ rows: [ruler, quickLiftChain, mane, wgEncodeRegDnaseWig]
+ ordered: true
+ exact: true
+ noText: "Warning/Error"