DirectoryScannerTest.java

package com.thoughtworks.qdox.directorywalker;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.util.List;

import static org.mockito.Mockito.*;

public class DirectoryScannerTest
{

    private File newMockFile( String name )
    {
        return newMockFile( name, false );
    }

    private File newMockFile( String name, boolean isDirectory )
    {
        File result = mock( File.class );
        when( result.getName() ).thenReturn( name );
        when( result.isDirectory() ).thenReturn( isDirectory );
        return result;
    }

    @Test
    public void testSingleDirectory()
    {
        File rootDir = newMockFile( "root", true );
        {
            File blahTxt = newMockFile( "blah.txt" );
            File fooTxt = newMockFile( "foo.txt" );
            File pigJava = newMockFile( "pig.java" );

            when( rootDir.listFiles() ).thenReturn( new File[] { blahTxt, fooTxt, pigJava } );
        }

        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        List<File> files = scanner.scan();
        Assertions.assertEquals(3, files.size());
        Assertions.assertEquals("blah.txt", files.get( 0 ).getName());
        Assertions.assertEquals("foo.txt", files.get( 1 ).getName());
        Assertions.assertEquals("pig.java", files.get( 2 ).getName());
    }

    @Test
    public void testDirectoryWithSubdir()
    {
        File rootDir = newMockFile( "root", true );
        {
            File subDir = newMockFile( "subdir", true );
            {
                File child1Txt = newMockFile( "child1.txt" );
                File child2Txt = newMockFile( "child2.txt" );

                when( subDir.listFiles() ).thenReturn( new File[] { child1Txt, child2Txt } );
            }
            File fooTxt = newMockFile( "foo.txt" );
            File pigJava = newMockFile( "pig.java" );

            when( rootDir.listFiles() ).thenReturn( new File[] { subDir, fooTxt, pigJava } );
        }

        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        List<File> files = scanner.scan();
        Assertions.assertEquals(4, files.size());
        Assertions.assertEquals("child1.txt", files.get( 0 ).getName());
        Assertions.assertEquals("child2.txt", files.get( 1 ).getName());
        Assertions.assertEquals("foo.txt", files.get( 2 ).getName());
        Assertions.assertEquals("pig.java", files.get( 3 ).getName());
    }

    @Test
    public void testDirectoryWithSubdirWithSubdir()
    {
        File rootDir = newMockFile( "root", true );
        {
            File subDir1 = newMockFile( "subdir", true );
            {
                File subDir2 = newMockFile( "subdir2", true );
                {
                    File grandChild1Txt = newMockFile( "grandChild1.txt" );

                    when( subDir2.listFiles() ).thenReturn( new File[] { grandChild1Txt } );
                }
                File child1Txt = newMockFile( "child1.txt" );
                File child2Txt = newMockFile( "child2.txt" );

                when( subDir1.listFiles() ).thenReturn( new File[] { subDir2, child1Txt, child2Txt } );

            }
            File fooTxt = newMockFile( "foo.txt" );
            File pigJava = newMockFile( "pig.java" );

            when( rootDir.listFiles() ).thenReturn( new File[] { subDir1, fooTxt, pigJava } );
        }

        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        List<File> files = scanner.scan();
        Assertions.assertEquals(5, files.size());
        Assertions.assertEquals("grandChild1.txt", files.get( 0 ).getName());
        Assertions.assertEquals("child1.txt", files.get( 1 ).getName());
        Assertions.assertEquals("child2.txt", files.get( 2 ).getName());
        Assertions.assertEquals("foo.txt", files.get( 3 ).getName());
        Assertions.assertEquals("pig.java", files.get( 4 ).getName());
    }

    @Test
    public void testSuffixFilter()
    {
        File rootDir = newMockFile( "root", true );
        {
            File blahTxt = newMockFile( "blah.txt" );
            File fooJava = newMockFile( "foo.java" );
            File pigJava = newMockFile( "pig.java" );

            when( rootDir.listFiles() ).thenReturn( new File[] { blahTxt, fooJava, pigJava } );
        }
        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        scanner.addFilter( new SuffixFilter( ".java" ) );
        List<File> files = scanner.scan();
        Assertions.assertEquals(2, files.size());
        Assertions.assertEquals("foo.java", files.get( 0 ).getName());
        Assertions.assertEquals("pig.java", files.get( 1 ).getName());
    }

    @Test
    public void testFilterCallback()
    {
        File rootDir = newMockFile( "root", true );
        {
            File blahTxt = newMockFile( "blah.txt" );
            File fooJava = newMockFile( "foo.java" );
            File pigJava = newMockFile( "pig.java" );

            when( rootDir.listFiles() ).thenReturn( new File[] { blahTxt, fooJava, pigJava } );
        }
        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        Filter mockFilter = new Filter()
        {
            public boolean filter( File file )
            {
                return file.getName().equals( "foo.java" );
            }
        };
        scanner.addFilter( mockFilter );
        List<File> files = scanner.scan();
        Assertions.assertEquals(1, files.size());
        Assertions.assertEquals("foo.java", files.get( 0 ).getName());
    }

    @Test
    public void testMultipleFilters()
    {
        File rootDir = newMockFile( "root", true );
        {
            File blahTxt = newMockFile( "blah.txt" );
            File fooJava = newMockFile( "foo.java" );
            File pigJava = newMockFile( "pig.java" );
            File fooTxt = newMockFile( "foo.txt" );

            when( rootDir.listFiles() ).thenReturn( new File[] { blahTxt, fooJava, pigJava, fooTxt } );
        }
        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        scanner.addFilter( new SuffixFilter( ".java" ) );
        scanner.addFilter( new Filter()
        {
            public boolean filter( File file )
            {
                return file.getName().startsWith( "foo" );
            }
        } );
        List<File> files = scanner.scan();
        Assertions.assertEquals(1, files.size());
        Assertions.assertEquals("foo.java", files.get( 0 ).getName());
    }

    @Test
    public void testFileVisitor()
    {
        File rootDir = newMockFile( "root", true );

        File blahTxt = newMockFile( "blah.txt" );
        File fooJava = newMockFile( "foo.java" );
        File pigJava = newMockFile( "pig.java" );

        when( rootDir.listFiles() ).thenReturn( new File[] { blahTxt, fooJava, pigJava } );

        DirectoryScanner scanner = new DirectoryScanner( rootDir );
        FileVisitor visitor = mock( FileVisitor.class );
        scanner.scan( visitor );

        verify( visitor ).visitFile( blahTxt );
        verify( visitor ).visitFile( fooJava );
        verify( visitor ).visitFile( pigJava );
    }
}