package com.googlecode.objectify.test;
import java.util.Arrays;
import java.util.List;
import org.testng.annotations.Test;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.test.entity.Name;
import com.googlecode.objectify.test.entity.Person;
import com.googlecode.objectify.test.entity.Town;
/**
* Tests that a certain-shaped Town results in the correct datastore Entity.
* The to-string of the Entity is also cut-and-pasted into the Wiki documentation
*/
public class ExampleDocoTests extends TestBase
{
@SuppressWarnings("unchecked")
@Test
public void testFirstExample() throws Exception
{
com.google.appengine.api.datastore.Entity e;
Town town;
System.out.println("First example:");
town = new Town();
town.name = "Springfield";
town.mayor = new Person(new Name("Joe", "Quimby"), 53);
town.folk = new Person[]{
new Person(new Name("Homer", "Simpson"), 39),
new Person(new Name("Apu", "Nahasapeemapetilon"), 48)
};
e = townToEntity(town);
System.out.println(e);
assert e.getProperties().size() == 7;
assert e.getProperty("name").equals("Springfield");
assert e.getProperty("mayor.name.firstName").equals("Joe");
assert e.getProperty("mayor.name.lastName").equals("Quimby");
assert ((Number)e.getProperty("mayor.age")).intValue() == 53; // might be Integer or Long
List<Number> ages = (List<Number>)e.getProperty("folk.age");
assert ages.size() == 2;
assert ages.get(0).intValue() == 39;
assert ages.get(1).intValue() == 48;
assert arrayPropertyEqual(e, "folk.name.firstName", "Homer", "Apu");
assert arrayPropertyEqual(e, "folk.name.lastName", "Simpson", "Nahasapeemapetilon");
town = loadTown(e);
assert town != null;
assert town.name != null;
assert town.name.equals("Springfield");
assert town.mayor != null;
assert town.mayor.name != null;
assert town.mayor.name.firstName.equals("Joe");
assert town.mayor.name.lastName.equals("Quimby");
assert town.mayor.age == 53;
assert town.folk != null;
assert town.folk.length == 2;
assert town.folk[0].name != null;
assert town.folk[0].name.firstName.equals("Homer");
assert town.folk[0].name.lastName.equals("Simpson");
assert town.folk[0].age == 39;
assert town.folk[1].name != null;
assert town.folk[1].name.firstName.equals("Apu");
assert town.folk[1].name.lastName.equals("Nahasapeemapetilon");
assert town.folk[1].age == 48;
}
@Test
public void testNullEmbedded2() throws Exception
{
com.google.appengine.api.datastore.Entity e;
Town town;
System.out.println("Null embedded 2:");
town = new Town();
town.name = null;
town.mayor = new Person(new Name("Joe", null), 53);
town.folk = null;
e = townToEntity(town);
System.out.println(e);
assert e.getProperties().size() == 4;
assert e.hasProperty("name") && e.getProperty("name") == null;
assert e.getProperty("mayor.name.firstName").equals("Joe");
assert e.hasProperty("mayor.name.lastName") && e.getProperty("mayor.name.lastName") == null;
assert ((Number)e.getProperty("mayor.age")).intValue() == 53; // might be Integer or Long
assert !e.hasProperty("folk");
town = loadTown(e);
assert town != null;
assert town.name == null;
assert town.mayor != null;
assert town.mayor.name != null;
assert town.mayor.name.firstName.equals("Joe");
assert town.mayor.name.lastName == null;
assert town.mayor.age == 53;
assert town.folk == null; // null collections are left alone
}
@Test
public void testNullEmbedded1() throws Exception
{
com.google.appengine.api.datastore.Entity e;
Town town;
System.out.println("Null embedded:");
town = new Town();
town.name = "Springfield";
town.mayor = null;
town.folk = new Person[0];
e = townToEntity(town);
System.out.println(e);
assert e.getProperties().size() == 2;
assert e.getProperty("name").equals("Springfield");
assert e.hasProperty("mayor") && e.getProperty("mayor") == null;
town = loadTown(e);
assert town != null;
assert town.name != null;
assert town.name.equals("Springfield");
assert town.mayor == null;
assert town.folk == null; // null collections are ignored
}
private Town loadTown(Entity e) throws EntityNotFoundException
{
Key<Town> k = fact.rawKeyToTypedKey(e.getKey());
return fact.begin().get(k);
}
private boolean arrayPropertyEqual(Entity e, String prop, Object... vals)
{
List<?> found = (List<?>) e.getProperty(prop);
return Arrays.asList(vals).equals(found);
}
private com.google.appengine.api.datastore.Entity townToEntity(Town town)
throws EntityNotFoundException
{
Objectify ofy = fact.begin();
Key<Town> k = ofy.put(town);
return ofy.getDatastore().get(fact.getRawKey(k));
}
}