// Path: src/main/java/at/favre/tools/uberadb/parser/AdbDevice.java
// public class AdbDevice {
//     public enum Status {
//         OK, OFFLINE, UNAUTHORIZED, BOOTLOADER, UNKNOWN
//     }
// 
//     public final String serial;
//     public final Status status;
//     public final String model;
//     public final String product;
//     public final boolean isEmulator;
// 
//     public AdbDevice(String serial, Status status, String model, String product, boolean isEmulator) {
//         this.serial = serial;
//         this.status = status;
//         this.model = model;
//         this.product = product;
//         this.isEmulator = isEmulator;
//     }
// 
//     @Override
//     public String toString() {
//         return "AdbDevice{" +
//                 "serial='" + serial + '\'' +
//                 ", status=" + status +
//                 ", model='" + model + '\'' +
//                 ", product='" + product + '\'' +
//                 ", isEmulator=" + isEmulator +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         AdbDevice adbDevice = (AdbDevice) o;
// 
//         if (isEmulator != adbDevice.isEmulator) return false;
//         if (serial != null ? !serial.equals(adbDevice.serial) : adbDevice.serial != null) return false;
//         if (status != adbDevice.status) return false;
//         if (model != null ? !model.equals(adbDevice.model) : adbDevice.model != null) return false;
//         return product != null ? product.equals(adbDevice.product) : adbDevice.product == null;
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = serial != null ? serial.hashCode() : 0;
//         result = 31 * result + (status != null ? status.hashCode() : 0);
//         result = 31 * result + (model != null ? model.hashCode() : 0);
//         result = 31 * result + (product != null ? product.hashCode() : 0);
//         result = 31 * result + (isEmulator ? 1 : 0);
//         return result;
//     }
// }
// 
// Path: src/main/java/at/favre/tools/uberadb/util/CmdUtil.java
// public final class CmdUtil {
// 
//     private CmdUtil() {
//     }
// 
//     public static <T> T[] concat(T[] first, T[] second) {
//         T[] result = Arrays.copyOf(first, first.length + second.length);
//         System.arraycopy(second, 0, result, first.length, second.length);
//         return result;
//     }
// 
//     public static File checkAndGetFromPATHEnvVar(CmdProvider provider, final String matchesExecutable) {
//         String pathEnv = System.getenv("PATH");
//         if (pathEnv != null) {
//             String[] pathParts = pathEnv.split(File.pathSeparator);
//             for (String pathPart : pathParts) {
//                 File pathFile = new File(pathPart);
// 
//                 if (pathFile.isFile() && pathFile.getName().toLowerCase().contains(matchesExecutable)) {
//                     return pathFile;
//                 } else if (pathFile.isDirectory()) {
//                     File[] matchedFiles = pathFile.listFiles(new FileFilter() {
//                         @Override
//                         public boolean accept(File pathname) {
//                             return FileUtil.getFileNameWithoutExtension(pathname).toLowerCase().equals(matchesExecutable);
//                         }
//                     });
// 
//                     if (matchedFiles != null) {
//                         for (File matchedFile : matchedFiles) {
//                             if (provider.canRunCmd(new String[]{matchedFile.getAbsolutePath()})) {
//                                 return matchedFile;
//                             }
//                         }
//                     }
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public static OS getOsType() {
//         String osName = System.getProperty("os.name").toLowerCase();
// 
//         if (osName.contains("win")) {
//             return OS.WIN;
//         }
//         if (osName.contains("mac")) {
//             return OS.MAC;
//         }
// 
//         return OS._NIX;
//     }
// 
//     public enum OS {
//         WIN, MAC, _NIX
//     }
// 
//     public static String concat(String[] array, String separator) {
//         StringBuilder sb = new StringBuilder();
//         String sep = "";
//         for (String s : array) {
//             sb.append(sep).append(s);
//             sep = separator;
//         }
//         return sb.toString();
//     }
// 
//     public static String jarVersion() {
//         return AdbTool.class.getPackage().getImplementationVersion();
//     }
// }


import at.favre.tools.uberadb.parser.AdbDevice;
import at.favre.tools.uberadb.util.CmdUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
package at.favre.tools.uberadb;



public class MockAdbCmdProvider implements CmdProvider {
    private List<AdbDevice> devices = Collections.emptyList();
    private List<String> installedPackages = Collections.emptyList();
    private boolean returnsSuccess = true;
    private boolean canRunCmd = true;
    private List<Result> history = new ArrayList<>();

    public MockAdbCmdProvider(List<AdbDevice> devices, List<String> installedPackages, boolean returnsSuccess) {
        this.devices = devices;
        this.installedPackages = installedPackages;
        this.returnsSuccess = returnsSuccess;
    }

    public MockAdbCmdProvider(boolean canRunCmd) {
        this.canRunCmd = canRunCmd;
    }

    @Override
    public Result runCmd(String[] args) {
// Path: src/main/java/at/favre/tools/uberadb/parser/AdbDevice.java
// public class AdbDevice {
//     public enum Status {
//         OK, OFFLINE, UNAUTHORIZED, BOOTLOADER, UNKNOWN
//     }
// 
//     public final String serial;
//     public final Status status;
//     public final String model;
//     public final String product;
//     public final boolean isEmulator;
// 
//     public AdbDevice(String serial, Status status, String model, String product, boolean isEmulator) {
//         this.serial = serial;
//         this.status = status;
//         this.model = model;
//         this.product = product;
//         this.isEmulator = isEmulator;
//     }
// 
//     @Override
//     public String toString() {
//         return "AdbDevice{" +
//                 "serial='" + serial + '\'' +
//                 ", status=" + status +
//                 ", model='" + model + '\'' +
//                 ", product='" + product + '\'' +
//                 ", isEmulator=" + isEmulator +
//                 '}';
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         AdbDevice adbDevice = (AdbDevice) o;
// 
//         if (isEmulator != adbDevice.isEmulator) return false;
//         if (serial != null ? !serial.equals(adbDevice.serial) : adbDevice.serial != null) return false;
//         if (status != adbDevice.status) return false;
//         if (model != null ? !model.equals(adbDevice.model) : adbDevice.model != null) return false;
//         return product != null ? product.equals(adbDevice.product) : adbDevice.product == null;
// 
//     }
// 
//     @Override
//     public int hashCode() {
//         int result = serial != null ? serial.hashCode() : 0;
//         result = 31 * result + (status != null ? status.hashCode() : 0);
//         result = 31 * result + (model != null ? model.hashCode() : 0);
//         result = 31 * result + (product != null ? product.hashCode() : 0);
//         result = 31 * result + (isEmulator ? 1 : 0);
//         return result;
//     }
// }
// 
// Path: src/main/java/at/favre/tools/uberadb/util/CmdUtil.java
// public final class CmdUtil {
// 
//     private CmdUtil() {
//     }
// 
//     public static <T> T[] concat(T[] first, T[] second) {
//         T[] result = Arrays.copyOf(first, first.length + second.length);
//         System.arraycopy(second, 0, result, first.length, second.length);
//         return result;
//     }
// 
//     public static File checkAndGetFromPATHEnvVar(CmdProvider provider, final String matchesExecutable) {
//         String pathEnv = System.getenv("PATH");
//         if (pathEnv != null) {
//             String[] pathParts = pathEnv.split(File.pathSeparator);
//             for (String pathPart : pathParts) {
//                 File pathFile = new File(pathPart);
// 
//                 if (pathFile.isFile() && pathFile.getName().toLowerCase().contains(matchesExecutable)) {
//                     return pathFile;
//                 } else if (pathFile.isDirectory()) {
//                     File[] matchedFiles = pathFile.listFiles(new FileFilter() {
//                         @Override
//                         public boolean accept(File pathname) {
//                             return FileUtil.getFileNameWithoutExtension(pathname).toLowerCase().equals(matchesExecutable);
//                         }
//                     });
// 
//                     if (matchedFiles != null) {
//                         for (File matchedFile : matchedFiles) {
//                             if (provider.canRunCmd(new String[]{matchedFile.getAbsolutePath()})) {
//                                 return matchedFile;
//                             }
//                         }
//                     }
//                 }
//             }
//         }
//         return null;
//     }
// 
//     public static OS getOsType() {
//         String osName = System.getProperty("os.name").toLowerCase();
// 
//         if (osName.contains("win")) {
//             return OS.WIN;
//         }
//         if (osName.contains("mac")) {
//             return OS.MAC;
//         }
// 
//         return OS._NIX;
//     }
// 
//     public enum OS {
//         WIN, MAC, _NIX
//     }
// 
//     public static String concat(String[] array, String separator) {
//         StringBuilder sb = new StringBuilder();
//         String sep = "";
//         for (String s : array) {
//             sb.append(sep).append(s);
//             sep = separator;
//         }
//         return sb.toString();
//     }
// 
//     public static String jarVersion() {
//         return AdbTool.class.getPackage().getImplementationVersion();
//     }
// }


// Path: src/test/java/at/favre/tools/uberadb/MockAdbCmdProvider.java
import at.favre.tools.uberadb.parser.AdbDevice;
import at.favre.tools.uberadb.util.CmdUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

package at.favre.tools.uberadb;



public class MockAdbCmdProvider implements CmdProvider {
    private List<AdbDevice> devices = Collections.emptyList();
    private List<String> installedPackages = Collections.emptyList();
    private boolean returnsSuccess = true;
    private boolean canRunCmd = true;
    private List<Result> history = new ArrayList<>();

    public MockAdbCmdProvider(List<AdbDevice> devices, List<String> installedPackages, boolean returnsSuccess) {
        this.devices = devices;
        this.installedPackages = installedPackages;
        this.returnsSuccess = returnsSuccess;
    }

    public MockAdbCmdProvider(boolean canRunCmd) {
        this.canRunCmd = canRunCmd;
    }

    @Override
    public Result runCmd(String[] args) {
        String flatCmd = CmdUtil.concat(args, " ");