@Test
	public void testSubFilter_EscapeCharacters_StartsWithFilter() {

		//
		// Test that sub filters correctly handle escape characters.  Users may enter backslashes
		// when attempting to escape globbing characters (i.e., ? or *)
		//

		TestRowObject ro = new TestRowObject("t?n", System.currentTimeMillis());
		model.addObject(ro);
		waitForTableModel(model);

		startsWithFilter_AllowGlobbing("t");
		assertFilteredEntireModel();
		assertRowCount(5); // matching values: two, ten, ten, ten, t?n

		// sub-filter
		startsWithFilter_AllowGlobbing("t\\"); // t\
		assertNumberOfItemsPassedThroughFilter(5);
		assertRowCount(0); // nothing matching a literal backslash

		startsWithFilter_AllowGlobbing("t\\?");
		// sub-filter again
		// The previous filter was not used due to the code that checks for globbing
		// escape characters.  But, the filter before that using just 't' is a valid parent of the
		// current filter, so that gets used.
		assertNumberOfItemsPassedThroughFilter(5);
		assertRowCount(1); // matching values: t?n

		// go backwards
		startsWithFilter_AllowGlobbing("t\\");
		assertNumberOfItemsPassedThroughFilter(5);
		assertRowCount(0); // nothing matching a literal backslash

		startsWithFilter_AllowGlobbing("t");

		// note: if the user is typing, no refilter will take place.  But, since we are setting a
		// new filter in this test, instead of typing, a refilter is forced.  This is why 5 items
		// pass through the filter instead of 0.
		assertNumberOfItemsPassedThroughFilter(5);
		assertRowCount(5); // matching values: two, ten, ten, ten, t?n
	}
Specifically tests the sub-filtering behavior of the {@link ThreadedTableModel}, as well
as some other more complicated filtering combinations
Ghidra/Framework/Docking/src/test.slow/java/docking/widgets/table/threaded/DefaultThreadedTableFilterTest.java