class TestData {
        
        public CrawlURI uri;
        public CrawlURI expectedResult;
        
        public TestData(CrawlURI uri, CrawlURI expectedResult) {
            this.uri = uri;
            this.expectedResult = expectedResult;
        }
    }


    /**
     * Returns an array of valid test data pairs.  The pairs consist of text
     * to be processed followed by 
     * 
     * @return  the test data 
     */
    protected abstract String[] getValidTestData();

    
    protected abstract Collection<TestData> makeData(String text, String uri)
    throws Exception;

    /**
     * Tests each text/URI pair in the test data array.
     * 
     * @throws Exception   just in case
     */
    public void testExtraction() throws Exception {<FILL_FUNCTION_BODY>

        try {
            String[] valid = getValidTestData();
            for (int i = 0; i < valid.length; i += 2) {
                testOne(valid[i], valid[i + 1]);
            }
        } catch (Exception e) {
            e.printStackTrace(); // I hate maven.
            throw e;
        }
    
<methods>public non-sealed void <init>() ,public static Recorder createRecorder(java.lang.String) throws java.io.IOException,public static Recorder createRecorder(java.lang.String, java.lang.String) throws java.io.IOException,public final void setUp() ,public void testFinished() throws java.lang.Exception,public void testZeroContent() throws java.lang.Exception<variables>protected org.archive.modules.extractor.Extractor extractor