// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static Pattern glob2Pattern(String... globs) {
//   final StringBuilder regex = new StringBuilder();
//   boolean needOr = false;
//   for (String glob : globs) {
//     if (needOr) {
//       regex.append('|');
//     }
//     int i = 0, len = glob.length();
//     while (i < len) {
//       char c = glob.charAt(i++);
//       switch (c) {
//         case '*':
//           if (i < len && glob.charAt(i) == '*') {
//             // crosses package boundaries
//             regex.append(".*");
//             i++;
//           } else {
//             // do not cross package boundaries
//             regex.append("[^.]*");
//           }
//           break;
//             
//         case '?':
//           // do not cross package boundaries
//           regex.append("[^.]");
//           break;
//           
//         default:
//           if (isRegexMeta(c)) {
//             regex.append('\\');
//           }
//           regex.append(c);
//       }
//     }
//     needOr = true;
//   }
//   return Pattern.compile(regex.toString(), 0);
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isGlob(String s) {
//   return s.indexOf('*') >= 0 || s.indexOf('?') >= 0;
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isPortableRuntimeClass(String className) {
//   return PORTABLE_RUNTIME_PACKAGE_PATTERN.matcher(className).matches();
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isRuntimeModule(String module) {
//   return module != null && RUNTIME_MODULES_PATTERN.matcher(module).matches();
// }


import static de.thetaphi.forbiddenapis.AsmUtils.glob2Pattern;
import static de.thetaphi.forbiddenapis.AsmUtils.isGlob;
import static de.thetaphi.forbiddenapis.AsmUtils.isPortableRuntimeClass;
import static de.thetaphi.forbiddenapis.AsmUtils.isRuntimeModule;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.regex.Pattern;
import org.junit.Test;
    assertFalse(pat.matcher("a.b.c.d.e").matches());
    
    pat = glob2Pattern("a.b.c.**");
    assertTrue(pat.matcher("a.b.c.d").matches());
    assertTrue(pat.matcher("a.b.c.def").matches());
    assertTrue(pat.matcher("a.b.c.d.e").matches());
    assertTrue(pat.matcher("a.b.c.d.e.f").matches());
    
    pat = glob2Pattern("sun.*.*");
    assertTrue(pat.matcher("sun.misc.Unsafe").matches());
    assertTrue(pat.matcher("sun.misc.Unsafe$1").matches());
    assertFalse(pat.matcher("sun.misc.Unsafe.xy").matches());
    
    pat = glob2Pattern("java.**.Array?");
    assertTrue(pat.matcher("java.util.Arrays").matches());
    assertFalse(pat.matcher("java.util.ArrayList").matches());
    assertFalse(pat.matcher("java.util.Array").matches());
    assertTrue(pat.matcher("java.lang.reflect.Arrays").matches());
  }
  
  @Test
  public void testCrazyPatterns() {
    // those should not cause havoc:
    assertEquals("java\\.\\{.*\\}\\.Array", glob2Pattern("java.{**}.Array").pattern());
    assertEquals("java\\./.*<>\\.Array\\$1", glob2Pattern("java./**<>.Array$1").pattern());
    assertEquals("\\+\\^\\$", glob2Pattern("+^$").pattern());
  }
  
  @Test
  public void testPortableRuntime() {
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static Pattern glob2Pattern(String... globs) {
//   final StringBuilder regex = new StringBuilder();
//   boolean needOr = false;
//   for (String glob : globs) {
//     if (needOr) {
//       regex.append('|');
//     }
//     int i = 0, len = glob.length();
//     while (i < len) {
//       char c = glob.charAt(i++);
//       switch (c) {
//         case '*':
//           if (i < len && glob.charAt(i) == '*') {
//             // crosses package boundaries
//             regex.append(".*");
//             i++;
//           } else {
//             // do not cross package boundaries
//             regex.append("[^.]*");
//           }
//           break;
//             
//         case '?':
//           // do not cross package boundaries
//           regex.append("[^.]");
//           break;
//           
//         default:
//           if (isRegexMeta(c)) {
//             regex.append('\\');
//           }
//           regex.append(c);
//       }
//     }
//     needOr = true;
//   }
//   return Pattern.compile(regex.toString(), 0);
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isGlob(String s) {
//   return s.indexOf('*') >= 0 || s.indexOf('?') >= 0;
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isPortableRuntimeClass(String className) {
//   return PORTABLE_RUNTIME_PACKAGE_PATTERN.matcher(className).matches();
// }
// 
// Path: src/main/java/de/thetaphi/forbiddenapis/AsmUtils.java
// public static boolean isRuntimeModule(String module) {
//   return module != null && RUNTIME_MODULES_PATTERN.matcher(module).matches();
// }


// Path: src/test/java/de/thetaphi/forbiddenapis/AsmUtilsTest.java
import static de.thetaphi.forbiddenapis.AsmUtils.glob2Pattern;
import static de.thetaphi.forbiddenapis.AsmUtils.isGlob;
import static de.thetaphi.forbiddenapis.AsmUtils.isPortableRuntimeClass;
import static de.thetaphi.forbiddenapis.AsmUtils.isRuntimeModule;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.regex.Pattern;
import org.junit.Test;

    assertFalse(pat.matcher("a.b.c.d.e").matches());
    
    pat = glob2Pattern("a.b.c.**");
    assertTrue(pat.matcher("a.b.c.d").matches());
    assertTrue(pat.matcher("a.b.c.def").matches());
    assertTrue(pat.matcher("a.b.c.d.e").matches());
    assertTrue(pat.matcher("a.b.c.d.e.f").matches());
    
    pat = glob2Pattern("sun.*.*");
    assertTrue(pat.matcher("sun.misc.Unsafe").matches());
    assertTrue(pat.matcher("sun.misc.Unsafe$1").matches());
    assertFalse(pat.matcher("sun.misc.Unsafe.xy").matches());
    
    pat = glob2Pattern("java.**.Array?");
    assertTrue(pat.matcher("java.util.Arrays").matches());
    assertFalse(pat.matcher("java.util.ArrayList").matches());
    assertFalse(pat.matcher("java.util.Array").matches());
    assertTrue(pat.matcher("java.lang.reflect.Arrays").matches());
  }
  
  @Test
  public void testCrazyPatterns() {
    // those should not cause havoc:
    assertEquals("java\\.\\{.*\\}\\.Array", glob2Pattern("java.{**}.Array").pattern());
    assertEquals("java\\./.*<>\\.Array\\$1", glob2Pattern("java./**<>.Array$1").pattern());
    assertEquals("\\+\\^\\$", glob2Pattern("+^$").pattern());
  }
  
  @Test
  public void testPortableRuntime() {
    assertFalse(isPortableRuntimeClass("sun.misc.Unsafe"));