blob: 2111410c1862170806c2e3c86911aef5c2095338 [file] [log] [blame]
/*
* Copyright 2017 The Bazel Authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.idea.blaze.clwb.run.test;
import com.google.common.base.Joiner;
import com.intellij.openapi.util.text.StringUtil;
import javax.annotation.Nullable;
/** A single gtest test case specification (https://github.com/google/googletest). */
public interface GoogleTestSpecification {
/** The gtest filter string. Returns null if there is no filtering. */
@Nullable
String testFilter();
/** A human-readable description for this test. Returns null if there is no filtering. */
@Nullable
String description();
/**
* Built from the raw gtest output, without separating parameter components, etc.<br>
* This means there is no ambiguity -- guaranteed to be exactly what the gtest runner expects for
* this test case.
*/
class FromGtestOutput implements GoogleTestSpecification {
private final String suiteComponent;
@Nullable private final String methodComponent;
public FromGtestOutput(String suiteComponent, @Nullable String methodComponent) {
this.suiteComponent = suiteComponent;
this.methodComponent = methodComponent;
}
@Override
public String testFilter() {
String method = methodComponent != null ? methodComponent : "*";
return String.format("%s.%s", suiteComponent, method);
}
@Override
public String description() {
return methodComponent == null
? suiteComponent
: String.format("%s.%s", suiteComponent, methodComponent);
}
}
/**
* We don't know whether it's parameterized / typed in this context, so need to provide a more
* flexible filter.
*/
class FromPsiElement implements GoogleTestSpecification {
@Nullable private final String suiteOrClass;
@Nullable private final String method;
@Nullable private final String instantiation;
@Nullable private final String param;
public FromPsiElement(
@Nullable String suiteOrClass,
@Nullable String method,
@Nullable String instantiation,
@Nullable String param) {
this.suiteOrClass = suiteOrClass;
this.method = method;
this.instantiation = instantiation;
this.param = param;
}
@Override
@Nullable
public String testFilter() {
if (suiteOrClass == null) {
return null;
}
String method = StringUtil.notNullize(this.method, "*");
String param = StringUtil.notNullize(this.param, "*");
if (instantiation != null) {
return Joiner.on(':')
.join(
String.format("%s/%s.%s/%s", instantiation, suiteOrClass, method, param),
String.format("%s/%s/%s.%s", instantiation, suiteOrClass, param, method));
}
// we don't know whether it's parameterized and/or typed, so need to handle all cases
return Joiner.on(':')
.join(
String.format("%s.%s", suiteOrClass, method),
String.format("%s/%s.%s", suiteOrClass, param, method),
String.format("*/%s.%s/*", suiteOrClass, method),
String.format("*/%s/*.%s", suiteOrClass, method));
}
@Override
@Nullable
public String description() {
if (suiteOrClass == null) {
return null;
}
if (method == null) {
return suiteOrClass;
}
if (instantiation == null) {
return suiteOrClass + "." + method;
}
String param = StringUtil.notNullize(this.param, "*");
return String.format("%s/%s.%s/%s", instantiation, suiteOrClass, method, param);
}
}
}