/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.poifs.filesystem;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

/**
 * Tests for org.apache.poi.poifs.filesystem<br/>
 */
@RunWith(Suite.class)
@Suite.SuiteClasses({
      TestDirectoryNode.class
    , TestDocument.class
    , TestDocumentDescriptor.class
    , TestDocumentInputStream.class
    , TestDocumentNode.class
    , TestDocumentOutputStream.class
    , TestEmptyDocument.class
    , TestOfficeXMLException.class
    , TestPOIFSDocumentPath.class
    , TestPOIFSFileSystem.class
    , TestNPOIFSFileSystem.class
    , TestPropertySorter.class
    , TestOle10Native.class
})
public final class AllPOIFSFileSystemTests {
}
