1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 package scenarios; 25 26 import hierarchies.TypeHierarchy; 27 28 /** 29 * Test scenario 30 * 31 * @param <T> parameter type 32 * @param <R> result type 33 */ 34 public abstract class Scenario<T extends TypeHierarchy.I, R> { 35 36 private final String name; 37 public final ProfilingType profilingType; 38 public final TypeHierarchy <? extends T, ? extends T> hierarchy; 39 protected volatile T field; 40 41 /** 42 * Constructor 43 * 44 * @param name scenario name 45 * @param profilingType tested profiling type 46 * @param hierarchy type hierarchy 47 */ 48 protected Scenario(String name, ProfilingType profilingType, 49 TypeHierarchy<? extends T, ? extends T> hierarchy) { 50 this.profilingType = profilingType; 51 this.name = name + " # " + profilingType.name(); 52 this.hierarchy = hierarchy; 53 } 54 55 /** 56 * Returns the object which should be used as a parameter 57 * for the methods used for profile data 58 * 59 * @return profiled type object 60 */ 61 public T getProfiled() { 62 return hierarchy.getM(); 63 } 64 65 /** 66 * Returns the object which makes a conflict for a profiled data 67 * when passed instead of {@linkplain Scenario#getProfiled} 68 * 69 * @return incompatible to profiled object 70 */ 71 public T getConflict() { 72 return hierarchy.getN(); 73 } 74 75 /** 76 * @return scenario name 77 */ 78 public String getName() { 79 return name; 80 } 81 82 /** Is this scenario applicable for a hierarchy it was constructed with */ 83 public boolean isApplicable() { 84 return true; 85 } 86 87 /** 88 * Runs test scenario 89 * 90 * @param t subject of the test 91 * @return result of the test invocation 92 */ 93 public abstract R run(T t); 94 95 /** Used for a return type profiling */ 96 protected final T collectReturnType(T t) { 97 return t; 98 } 99 100 /** 101 * Checks the result for R and T 102 * 103 * @param r result 104 * @param t original 105 * @throws java.lang.RuntimeException on result mismatch 106 */ 107 public abstract void check(R r, T t); 108 }