1 // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file 2 // for details. All rights reserved. Use of this source code is governed by a 3 // BSD-style license that can be found in the LICENSE file. 4 package com.android.tools.r8; 5 6 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest; 7 import com.android.tools.r8.R8RunArtTestsTest.DexTool; 8 import com.android.tools.r8.ToolHelper.DexVm; 9 import java.util.Arrays; 10 import java.util.EnumSet; 11 12 public class TestCondition { 13 14 static class ToolSet { 15 16 final EnumSet<DexTool> set; 17 ToolSet(EnumSet<DexTool> set)18 public ToolSet(EnumSet<DexTool> set) { 19 this.set = set; 20 } 21 } 22 23 static class CompilerSet { 24 25 final EnumSet<CompilerUnderTest> set; 26 CompilerSet(EnumSet<CompilerUnderTest> set)27 public CompilerSet(EnumSet<CompilerUnderTest> set) { 28 this.set = set; 29 } 30 } 31 32 static class RuntimeSet { 33 34 final EnumSet<DexVm> set; 35 RuntimeSet(EnumSet<DexVm> set)36 public RuntimeSet(EnumSet<DexVm> set) { 37 this.set = set; 38 } 39 } 40 41 static class CompilationModeSet { 42 43 final EnumSet<CompilationMode> set; 44 CompilationModeSet(EnumSet<CompilationMode> set)45 public CompilationModeSet(EnumSet<CompilationMode> set) { 46 this.set = set; 47 } 48 } 49 50 public static final CompilerSet D8_COMPILER = compilers(CompilerUnderTest.D8); 51 // R8_COMPILER refers to R8 both in the standalone setting and after D8 52 // R8_NOT_AFTER_D8_COMPILER and R8_AFTER_D8_COMPILER refers to the standalone and the combined 53 // settings, respectively 54 public static final CompilerSet R8_COMPILER = 55 compilers(CompilerUnderTest.R8, CompilerUnderTest.R8_AFTER_D8); 56 public static final CompilerSet R8_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8_AFTER_D8); 57 public static final CompilerSet R8_NOT_AFTER_D8_COMPILER = compilers(CompilerUnderTest.R8); 58 59 public static final CompilationModeSet DEBUG_MODE = 60 new CompilationModeSet(EnumSet.of(CompilationMode.DEBUG)); 61 public static final CompilationModeSet RELEASE_MODE = 62 new CompilationModeSet(EnumSet.of(CompilationMode.RELEASE)); 63 64 private static final ToolSet ANY_TOOL = new ToolSet(EnumSet.allOf(DexTool.class)); 65 private static final CompilerSet ANY_COMPILER = 66 new CompilerSet(EnumSet.allOf(CompilerUnderTest.class)); 67 private static final RuntimeSet ANY_RUNTIME = new RuntimeSet(EnumSet.allOf(DexVm.class)); 68 private static final CompilationModeSet ANY_MODE = 69 new CompilationModeSet(EnumSet.allOf(CompilationMode.class)); 70 71 private final EnumSet<DexTool> dexTools; 72 private final EnumSet<CompilerUnderTest> compilers; 73 private final EnumSet<DexVm> dexVms; 74 private final EnumSet<CompilationMode> compilationModes; 75 TestCondition( EnumSet<DexTool> dexTools, EnumSet<CompilerUnderTest> compilers, EnumSet<DexVm> dexVms, EnumSet<CompilationMode> compilationModes)76 public TestCondition( 77 EnumSet<DexTool> dexTools, 78 EnumSet<CompilerUnderTest> compilers, 79 EnumSet<DexVm> dexVms, 80 EnumSet<CompilationMode> compilationModes) { 81 this.dexTools = dexTools; 82 this.compilers = compilers; 83 this.dexVms = dexVms; 84 this.compilationModes = compilationModes; 85 } 86 tools(DexTool... tools)87 public static ToolSet tools(DexTool... tools) { 88 assert tools.length > 0; 89 return new ToolSet(EnumSet.copyOf(Arrays.asList(tools))); 90 } 91 compilers(CompilerUnderTest... compilers)92 public static CompilerSet compilers(CompilerUnderTest... compilers) { 93 assert compilers.length > 0; 94 return new CompilerSet(EnumSet.copyOf(Arrays.asList(compilers))); 95 } 96 runtimes(DexVm... runtimes)97 public static RuntimeSet runtimes(DexVm... runtimes) { 98 assert runtimes.length > 0; 99 return new RuntimeSet(EnumSet.copyOf(Arrays.asList(runtimes))); 100 } 101 match( ToolSet tools, CompilerSet compilers, RuntimeSet runtimes, CompilationModeSet compilationModes)102 public static TestCondition match( 103 ToolSet tools, 104 CompilerSet compilers, 105 RuntimeSet runtimes, 106 CompilationModeSet compilationModes) { 107 return new TestCondition(tools.set, compilers.set, runtimes.set, compilationModes.set); 108 } 109 match(ToolSet tools, CompilerSet compilers, RuntimeSet runtimes)110 public static TestCondition match(ToolSet tools, CompilerSet compilers, RuntimeSet runtimes) { 111 return match(tools, compilers, runtimes, TestCondition.ANY_MODE); 112 } 113 any()114 public static TestCondition any() { 115 return match(TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME); 116 } 117 match(ToolSet tools)118 public static TestCondition match(ToolSet tools) { 119 return match(tools, TestCondition.ANY_COMPILER, TestCondition.ANY_RUNTIME); 120 } 121 match(ToolSet tools, CompilerSet compilers)122 public static TestCondition match(ToolSet tools, CompilerSet compilers) { 123 return match(tools, compilers, TestCondition.ANY_RUNTIME); 124 } 125 match(ToolSet tools, RuntimeSet runtimes)126 public static TestCondition match(ToolSet tools, RuntimeSet runtimes) { 127 return match(tools, TestCondition.ANY_COMPILER, runtimes); 128 } 129 match(CompilerSet compilers)130 public static TestCondition match(CompilerSet compilers) { 131 return match(TestCondition.ANY_TOOL, compilers, TestCondition.ANY_RUNTIME); 132 } 133 match(CompilerSet compilers, CompilationModeSet compilationModes)134 public static TestCondition match(CompilerSet compilers, CompilationModeSet compilationModes) { 135 return match(TestCondition.ANY_TOOL, compilers, TestCondition.ANY_RUNTIME, compilationModes); 136 } 137 match(CompilerSet compilers, RuntimeSet runtimes)138 public static TestCondition match(CompilerSet compilers, RuntimeSet runtimes) { 139 return match(TestCondition.ANY_TOOL, compilers, runtimes); 140 } 141 match(RuntimeSet runtimes)142 public static TestCondition match(RuntimeSet runtimes) { 143 return match(TestCondition.ANY_TOOL, TestCondition.ANY_COMPILER, runtimes); 144 } 145 test( DexTool dexTool, CompilerUnderTest compilerUnderTest, DexVm dexVm, CompilationMode compilationMode)146 public boolean test( 147 DexTool dexTool, 148 CompilerUnderTest compilerUnderTest, 149 DexVm dexVm, 150 CompilationMode compilationMode) { 151 return dexTools.contains(dexTool) 152 && compilers.contains(compilerUnderTest) 153 && dexVms.contains(dexVm) 154 && compilationModes.contains(compilationMode); 155 } 156 } 157