/*
* Copyright (C) 2012-2015 DataStax Inc.
*
* 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.datastax.driver.core;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import org.assertj.core.api.AbstractListAssert;
import org.assertj.core.data.Index;
import java.util.Arrays;
import java.util.List;
// better use ListAssert than IterableAssert to avoid attempting to consume the resultset more than once
public class ResultSetAssert extends AbstractListAssert<ResultSetAssert, List<Row>, Row> {
// a helper assert object to simplify assertions on row contents
// by considering a row as a mere tuple
private final TupleListAssert helper;
public ResultSetAssert(ResultSet actual) {
super(actual.all(), ResultSetAssert.class);
helper = new TupleListAssert(Lists.transform(this.actual, ROW_TO_TUPLE));
}
public static Tuple row(Object... cols) {
return new Tuple(cols);
}
public ResultSetAssert contains(Tuple value, Index index) {
helper.contains(value, index);
return this;
}
public ResultSetAssert containsSubsequence(Tuple... sequence) {
helper.containsSubsequence(sequence);
return this;
}
public ResultSetAssert containsOnly(Tuple... values) {
helper.containsOnly(values);
return this;
}
public ResultSetAssert endsWith(Tuple... sequence) {
helper.endsWith(sequence);
return this;
}
public ResultSetAssert startsWith(Tuple... sequence) {
helper.startsWith(sequence);
return this;
}
public ResultSetAssert doesNotContain(Tuple value, Index index) {
helper.doesNotContain(value, index);
return this;
}
public ResultSetAssert doesNotContain(Tuple... values) {
helper.doesNotContain(values);
return this;
}
public ResultSetAssert containsExactly(Tuple... values) {
helper.containsExactly(values);
return this;
}
public ResultSetAssert containsOnlyOnce(Tuple... values) {
helper.containsOnlyOnce(values);
return this;
}
public ResultSetAssert contains(Tuple... values) {
helper.contains(values);
return this;
}
public ResultSetAssert containsSequence(Tuple... sequence) {
helper.containsSequence(sequence);
return this;
}
public static class Tuple {
final Object[] cols;
public Tuple(Object... cols) {
this.cols = cols;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (getClass() != o.getClass()) return false;
Tuple tuple = (Tuple) o;
return Arrays.equals(cols, tuple.cols);
}
@Override
public int hashCode() {
return Arrays.hashCode(cols);
}
@Override
public String toString() {
return '(' + Joiner.on(',').join(cols) + ')';
}
}
private static final Function<Row, Tuple> ROW_TO_TUPLE = new Function<Row, Tuple>() {
@Override
public Tuple apply(Row input) {
Object[] cols = new Object[input.getColumnDefinitions().size()];
for (int i = 0; i < input.getColumnDefinitions().size(); i++) {
cols[i] = input.getObject(i);
}
return new Tuple(cols);
}
};
private static class TupleListAssert extends AbstractListAssert<TupleListAssert, List<Tuple>, Tuple> {
private TupleListAssert(List<Tuple> rows) {
super(rows, TupleListAssert.class);
}
}
}