// Path: src/main/java/com/technofovea/hllib/enums/DirectoryItemType.java
// public enum DirectoryItemType implements JnaEnum<DirectoryItemType> {
// 
//     
//     NONE,
//     FOLDER,
//     FILE;
// 
// 
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal()+start;
//     }
// 
// 
//     public DirectoryItemType getForValue(int i) {
//         for(DirectoryItemType o : this.values()){
//             if(o.getIntValue() == i){
//                 return o;
//             }
//         }
//         return null;
//     }
// 
// 
// 
// 
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/HlOption.java
// public enum HlOption implements JnaEnum<HlOption> {
// 
//     VERSION,
//     ERROR,
//     ERROR_SYSTEM,
//     ERROR_SHORT_FORMATED,
//     ERROR_LONG_FORMATED,
//     PROC_OPEN,
//     PROC_CLOSE,
//     PROC_READ,
//     PROC_WRITE,
//     PROC_SEEK,
//     PROC_TELL,
//     PROC_SIZE,
//     PROC_EXTRACT_ITEM_START,
//     PROC_EXTRACT_ITEM_END,
//     PROC_EXTRACT_FILE_PROGRESS,
//     PROC_VALIDATE_FILE_PROGRESS,
//     OVERWRITE_FILES,
//     PACKAGE_BOUND,
//     PACKAGE_ID,
//     PACKAGE_SIZE,
//     PACKAGE_TOTAL_ALLOCATIONS,
//     PACKAGE_TOTAL_MEMORY_ALLOCATED,
//     PACKAGE_TOTAL_MEMORY_USED,
//     READ_ENCRYPTED,
//     FORCE_DEFRAGMENT,
//     PROC_DEFRAGMENT_PROGRESS,
//     PROC_DEFRAGMENT_PROGRESS_EX,;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
// 
//     public HlOption getForValue(int i) {
//         for (HlOption o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
//         }
//         return null;
//     }
//     
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/PackageType.java
// public enum PackageType implements JnaEnum<PackageType> {
// 
//     NONE,
//     BSP,
//     GCF,
//     PAK,
//     VBSP,
//     WAD,
//     XZP,
//     ZIP,
//     NCF,
//     VPK;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
//     public PackageType getForValue(
//             int i) {
//         for (PackageType o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
// 
//         }
//         return null;
//     }
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/StreamType.java
// public enum StreamType implements JnaEnum<StreamType> {
// 
//         NONE,
// 	FILE,
// 	GCF,
// 	MAPPING,
// 	MEMORY,
// 	PROC,
// 	NULL;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
//     public StreamType getForValue(int i) {
//         for (StreamType o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
//         }
//         return null;
//     }
// }
// 
// Path: src/main/java/com/technofovea/hllib/masks/FileMode.java
// public class FileMode extends MappedMask{
//     
// 	public static final int INDEX_MODE_READ= 0;
// 	public static final int INDEX_MODE_WRITE= 1;
// 	public static final int INDEX_MODE_CREATE= 2;
// 	public static final int INDEX_MODE_VOLATILE= 3;
// 	public static final int INDEX_MODE_NO_FILEMAPPING= 4;
// 	public static final int INDEX_MODE_QUICK_FILEMAPPING= 5;
// 
// }
// 
// Path: src/main/java/com/technofovea/hllib/methods/ManagedLibrary.java
// public interface ManagedLibrary extends BasicLibrary, ManagedCalls{       
// 
// }


import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.technofovea.hllib.enums.DirectoryItemType;
import com.technofovea.hllib.enums.HlOption;
import com.technofovea.hllib.enums.PackageType;
import com.technofovea.hllib.enums.StreamType;
import com.technofovea.hllib.masks.FileMode;
import com.technofovea.hllib.methods.ManagedLibrary;
import java.io.File;
import java.net.URL;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
package com.technofovea.hllib;



/**
 *
 * @author Darien Hager
 */
public class ExtractTest {

    private static final String TEST_FILE = "root\\readme.txt";
    private static final int TEST_FILE_SIZE = 39818;
    private static final String TEST_FILE_START = "Half-Life\r\nVersion 1.1.1.1\r\nReadme File";
    static ManagedLibrary fixture;

    @BeforeClass
    public static void BeforeClass() throws Exception {
        DllPathFinder.setJnaPathPath();
        fixture = HlLib.getLibrary();

    }

    @Test
    public void extractReadme() throws Exception {

        URL testurl = GcfFinder.getTestGcf();
        File target = new File(testurl.toURI());

        PackageType pt = fixture.getPackageType(target);

        HlPackage pkg = fixture.createPackage(pt);
        if (pkg == null) {
            String err = fixture.getString(HlOption.ERROR);
            throw new HlLibException("Unable to create package (" + pt.toString() + ") for binding to file: " + err);
        }

        boolean r_bind = fixture.bindPackage(pkg);
        if (!r_bind) {
            String err = fixture.getString(HlOption.ERROR);
            throw new HlLibException("Could not bind package to file: " + err);
        }


// Path: src/main/java/com/technofovea/hllib/enums/DirectoryItemType.java
// public enum DirectoryItemType implements JnaEnum<DirectoryItemType> {
// 
//     
//     NONE,
//     FOLDER,
//     FILE;
// 
// 
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal()+start;
//     }
// 
// 
//     public DirectoryItemType getForValue(int i) {
//         for(DirectoryItemType o : this.values()){
//             if(o.getIntValue() == i){
//                 return o;
//             }
//         }
//         return null;
//     }
// 
// 
// 
// 
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/HlOption.java
// public enum HlOption implements JnaEnum<HlOption> {
// 
//     VERSION,
//     ERROR,
//     ERROR_SYSTEM,
//     ERROR_SHORT_FORMATED,
//     ERROR_LONG_FORMATED,
//     PROC_OPEN,
//     PROC_CLOSE,
//     PROC_READ,
//     PROC_WRITE,
//     PROC_SEEK,
//     PROC_TELL,
//     PROC_SIZE,
//     PROC_EXTRACT_ITEM_START,
//     PROC_EXTRACT_ITEM_END,
//     PROC_EXTRACT_FILE_PROGRESS,
//     PROC_VALIDATE_FILE_PROGRESS,
//     OVERWRITE_FILES,
//     PACKAGE_BOUND,
//     PACKAGE_ID,
//     PACKAGE_SIZE,
//     PACKAGE_TOTAL_ALLOCATIONS,
//     PACKAGE_TOTAL_MEMORY_ALLOCATED,
//     PACKAGE_TOTAL_MEMORY_USED,
//     READ_ENCRYPTED,
//     FORCE_DEFRAGMENT,
//     PROC_DEFRAGMENT_PROGRESS,
//     PROC_DEFRAGMENT_PROGRESS_EX,;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
// 
//     public HlOption getForValue(int i) {
//         for (HlOption o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
//         }
//         return null;
//     }
//     
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/PackageType.java
// public enum PackageType implements JnaEnum<PackageType> {
// 
//     NONE,
//     BSP,
//     GCF,
//     PAK,
//     VBSP,
//     WAD,
//     XZP,
//     ZIP,
//     NCF,
//     VPK;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
//     public PackageType getForValue(
//             int i) {
//         for (PackageType o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
// 
//         }
//         return null;
//     }
// }
// 
// Path: src/main/java/com/technofovea/hllib/enums/StreamType.java
// public enum StreamType implements JnaEnum<StreamType> {
// 
//         NONE,
// 	FILE,
// 	GCF,
// 	MAPPING,
// 	MEMORY,
// 	PROC,
// 	NULL;
//     
//     private static int start = 0;
// 
//     public int getIntValue() {
//         return this.ordinal() + start;
//     }
// 
//     public StreamType getForValue(int i) {
//         for (StreamType o : this.values()) {
//             if (o.getIntValue() == i) {
//                 return o;
//             }
//         }
//         return null;
//     }
// }
// 
// Path: src/main/java/com/technofovea/hllib/masks/FileMode.java
// public class FileMode extends MappedMask{
//     
// 	public static final int INDEX_MODE_READ= 0;
// 	public static final int INDEX_MODE_WRITE= 1;
// 	public static final int INDEX_MODE_CREATE= 2;
// 	public static final int INDEX_MODE_VOLATILE= 3;
// 	public static final int INDEX_MODE_NO_FILEMAPPING= 4;
// 	public static final int INDEX_MODE_QUICK_FILEMAPPING= 5;
// 
// }
// 
// Path: src/main/java/com/technofovea/hllib/methods/ManagedLibrary.java
// public interface ManagedLibrary extends BasicLibrary, ManagedCalls{       
// 
// }


// Path: src/test/java/com/technofovea/hllib/ExtractTest.java
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.technofovea.hllib.enums.DirectoryItemType;
import com.technofovea.hllib.enums.HlOption;
import com.technofovea.hllib.enums.PackageType;
import com.technofovea.hllib.enums.StreamType;
import com.technofovea.hllib.masks.FileMode;
import com.technofovea.hllib.methods.ManagedLibrary;
import java.io.File;
import java.net.URL;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

package com.technofovea.hllib;



/**
 *
 * @author Darien Hager
 */
public class ExtractTest {

    private static final String TEST_FILE = "root\\readme.txt";
    private static final int TEST_FILE_SIZE = 39818;
    private static final String TEST_FILE_START = "Half-Life\r\nVersion 1.1.1.1\r\nReadme File";
    static ManagedLibrary fixture;

    @BeforeClass
    public static void BeforeClass() throws Exception {
        DllPathFinder.setJnaPathPath();
        fixture = HlLib.getLibrary();

    }

    @Test
    public void extractReadme() throws Exception {

        URL testurl = GcfFinder.getTestGcf();
        File target = new File(testurl.toURI());

        PackageType pt = fixture.getPackageType(target);

        HlPackage pkg = fixture.createPackage(pt);
        if (pkg == null) {
            String err = fixture.getString(HlOption.ERROR);
            throw new HlLibException("Unable to create package (" + pt.toString() + ") for binding to file: " + err);
        }

        boolean r_bind = fixture.bindPackage(pkg);
        if (!r_bind) {
            String err = fixture.getString(HlOption.ERROR);
            throw new HlLibException("Could not bind package to file: " + err);
        }


        FileMode fm = new FileMode();