/* Copyright (C) 2004 - 2005  db4objects Inc.  http://www.db4o.com

This file is part of the db4o open source object database.

db4o is free software; you can redistribute it and/or modify it under
the terms of version 2 of the GNU General Public License as published
by the Free Software Foundation and as clarified by db4objects' GPL 
interpretation policy, available at
http://www.db4o.com/about/company/legalpolicies/gplinterpretation/
Alternatively you can write to db4objects, Inc., 1900 S Norfolk Street,
Suite 350, San Mateo, CA 94403, USA.

db4o is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */
using System;
using com.db4o;
using com.db4o.query;
using System.Collections;

namespace com.db4o.test.nativequeries
{
	public class Cat 
	{
		public String name;
    
		public Cat()
		{
		}
    
		public Cat(String name)
		{
			this.name = name;
		}
    
		public void store()
		{
			Tester.store(new Cat("Fritz"));
			Tester.store(new Cat("Garfield"));
			Tester.store(new Cat("Tom"));
			Tester.store(new Cat("Occam"));
			Tester.store(new Cat("Zora"));
		}
    
		public void testOrPredicate()
		{
            if(Db4oVersion.MAJOR >= 5){
                ObjectContainer objectContainer = Tester.objectContainer();
                ObjectSet objectSet = objectContainer.query(new OrPredicate());
                Tester.ensureEquals(2, objectSet.Count);
                ensureContains(objectSet, "Occam");
                ensureContains(objectSet, "Zora");
            }
		}
		
		public class OrPredicate : Predicate
		{
			public bool match(Cat cat)
			{
				return cat.name == "Occam" || cat.name == "Zora"; 
			}
		}

#if NET_2_0
        public void testGenericPredicate()
        {
            if(Db4oVersion.MAJOR >= 5){
                ObjectContainer objectContainer = Tester.objectContainer();
                System.Collections.Generic.IList<Cat> found = objectContainer.query<Cat>(delegate(Cat c)
                {
                    return c.name == "Occam" || c.name == "Zora";
                });
                Tester.ensureEquals(2, found.Count);
                ensureContains(found, "Occam");
                ensureContains(found, "Zora");
            }
        }
#endif

        private void ensureContains(IEnumerable objectSet, string catName)
        {
            foreach (Cat cat in objectSet)
            {
              if (cat.name == catName) return;
            }
            Tester.ensure(catName + " expected!", false);
        }
	}
}
