/*
* Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
*
* 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.querydsl.jdo;
import static org.junit.Assert.*;
import java.io.IOException;
import java.util.Arrays;
import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.NonUniqueResultException;
import com.querydsl.core.types.Expression;
import com.querydsl.core.types.Projections;
import com.querydsl.jdo.test.domain.Book;
import com.querydsl.jdo.test.domain.Product;
import com.querydsl.jdo.test.domain.QBook;
import com.querydsl.jdo.test.domain.QProduct;
public class BasicsTest extends AbstractJDOTest {
private static final JDOQLTemplates templates = new JDOQLTemplates();
private final QBook book = QBook.book;
private final QProduct product = QProduct.product;
private final QProduct product2 = new QProduct("product2");
@Test
public void serialization() throws IOException {
JDOQuery<?> query = query();
assertEquals("FROM com.querydsl.jdo.test.domain.Product", query.from(product).toString());
assertEquals("FROM com.querydsl.jdo.test.domain.Product" +
"\nVARIABLES com.querydsl.jdo.test.domain.Product product2",
query.from(product2).toString());
query.where(product.ne(product2)).select(product, product2).fetch();
query.close();
}
@Test
public void subQuerySerialization() throws IOException {
JDOQuery<?> query = query();
assertEquals("FROM com.querydsl.jdo.test.domain.Product", query.from(product).toString());
assertEquals("FROM com.querydsl.jdo.test.domain.Product" +
"\nVARIABLES com.querydsl.jdo.test.domain.Product product2",
query.from(product2).toString());
}
@Test
public void delete() {
long count = query().from(product).fetchCount();
assertEquals(0, delete(product).where(product.name.eq("XXX")).execute());
assertEquals(count, delete(product).execute());
}
@Test
public void alias() {
assertEquals(2, query().from(product).select(product.name.as(product.name)).fetch().size());
}
@Test
public void countTests() {
assertEquals("count", 2, query().from(product).fetchCount());
}
@Test
public void list_distinct() {
// XXX List implementation of JDO provider has weird equals implementation
assertEquals(
ImmutableList.copyOf(query().from(product).orderBy(product.name.asc()).select(product.name).fetch()),
ImmutableList.copyOf(query().from(product).orderBy(product.name.asc()).distinct().select(product.name).fetch()));
}
@Test
public void list_distinct_two_sources() {
try {
// XXX List implementation of JDO provider has weird equals implementation
assertEquals(
ImmutableList.copyOf(query().from(product, product2).select(product, product2).fetch()),
ImmutableList.copyOf(query().from(product, product2).distinct().select(product, product2).fetch()));
} catch (AssertionError e) {
Assume.assumeNoException("Unreliable test, but keep around", e);
}
}
@Test
public void single_result() {
query().from(product).select(product).fetchFirst();
}
@Test
public void single_result_with_array() {
query().from(product).select(new Expression<?>[]{product}).fetchFirst();
}
@Test
public void factoryExpression_in_groupBy() {
Expression<Product> productBean = Projections.bean(Product.class, product.name, product.description);
assertFalse(query().from(product).groupBy(productBean).select(productBean).fetch().isEmpty());
}
@Test(expected = NonUniqueResultException.class)
public void unique_result_throws_exception_on_multiple_results() {
query().from(product).select(product).fetchOne();
}
@Test
public void simpleTest() throws IOException {
JDOQuery<?> query = new JDOQuery<Void>(pm, templates, false);
assertEquals("Sony Discman", query.from(product).where(product.name.eq("Sony Discman"))
.select(product.name).fetchOne());
query.close();
}
@Test
public void projectionTests() {
assertEquals("Sony Discman", query().from(product).where(product.name.eq("Sony Discman"))
.select(product.name).fetchOne());
}
@Test
public void basicTests() {
assertEquals("list", 2, query().from(product).select(product).fetch().size());
assertEquals("list", 2, query().from(product).select(product.name,product.description).fetch().size());
assertEquals("list", 1, query().from(book).select(book).fetch().size());
assertEquals("eq", 1, query(product, product.name.eq("Sony Discman")).size());
assertEquals("instanceof ", 1, query(product,product.instanceOf(Book.class)).size());
}
@Test
@Ignore
public void detachedResults() {
for (Product p : detachedQuery().from(product).select(product).fetch()) {
assertNotNull(p);
}
}
@Test
public void empty_booleanBuilder() {
assertEquals("empty boolean builder", 2, query(product, new BooleanBuilder()).size());
}
@Test
public void and() {
assertEquals("and", 1, query(product, product.name.eq("Sony Discman").and(product.price.loe(300.00))).size());
}
@Test
public void or() {
assertEquals("or", 2, query(product, product.name.eq("Sony Discman").or(product.price.loe(300.00))).size());
}
@Test
public void not() {
assertEquals("not", 2, query(product, product.name.eq("Sony MP3 player").not()).size());
}
@Test
public void numericTests() {
// numeric
// TODO +
// TODO -
// TODO *
// TODO /
// TODO %
// TODO Math.abs
// TODO Math.sqrt
}
@Test
public void eq() {
assertEquals("eq", 1, query(product, product.price.eq(200.00)).size());
assertEquals("eq", 0, query(product, product.price.eq(100.00)).size());
}
@Test
public void ne() {
assertEquals("ne", 2, query(product, product.price.ne(100.00)).size());
}
@Test
public void in_empty() {
assertEquals(0, query(product, product.name.in(ImmutableList.<String>of())).size());
}
@Test
public void not_in_empty() {
int count = query(product, product.name.isNotNull()).size();
assertEquals(count, query(product, product.name.notIn(ImmutableList.<String>of())).size());
}
@Test
public void lt() {
assertEquals("lt", 2, query(product, product.price.lt(300.00)).size());
}
@Test
public void gt() {
assertEquals("gt", 1, query(product, product.price.gt(100.00)).size());
}
@Test
public void goe() {
assertEquals("goe", 1, query(product, product.price.goe(100.00)).size());
}
@Test
public void loe() {
assertEquals("loe", 2, query(product, product.price.loe(300.00)).size());
}
@Test
public void starts_with() {
assertEquals("startsWith", 1, query(product,product.name.startsWith("Sony Discman")).size());
}
@Test
public void matches() {
assertEquals("matches", 1, query(product,product.name.matches("Sony.*")).size());
assertSame(
query(product, product.name.matches("Sony.*")).size(),
query(product, product.name.likeIgnoreCase("sony%")).size()
);
}
@Test
public void like() {
assertEquals("matches", 1, query(product,product.name.like("Sony%")).size());
}
@Test
public void ends_with() {
assertEquals("endsWith", 1, query(product,product.name.endsWith("Discman")).size());
}
@Test
public void to_lowerCase() {
assertEquals("toLowerCase", 1, query(product,product.name.lower().eq("sony discman")).size());
}
@Test
public void to_upperCase() {
assertEquals("toUpperCase", 1, query(product,product.name.upper().eq("SONY DISCMAN")).size());
}
@Test
public void index_of() {
assertEquals("indexOf", 1, query(product,product.name.indexOf("S").eq(0)).size());
}
@Test
public void substring1() {
assertEquals("substring", 1, query(product,product.name.substring(5).eq("Discman")).size());
}
@Test
public void substring2() {
assertEquals("substring", 1, query(product,product.name.substring(0, 4).eq("Sony")).size());
}
@BeforeClass
public static void doPersist() {
doPersist(Arrays.asList(
new Product("Sony Discman", "A standard discman from Sony", 200.00, 3),
new Book("Lord of the Rings by Tolkien", "The classic story", 49.99, 5, "JRR Tolkien", "12345678", "MyBooks Factory")));
}
}