/* 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 System.Collections;
using com.db4o.foundation;
using com.db4o;
namespace com.db4o.test {

   public class CascadeToArrayList {
      
      public CascadeToArrayList() : base() {
      }
      internal ArrayList al;
      
      public void configure() {
         Db4o.configure().objectClass(this).cascadeOnUpdate(true);
         Db4o.configure().objectClass(this).cascadeOnDelete(true);
      }
      
      public void store() {
         Tester.deleteAllInstances(this);
         Tester.deleteAllInstances(new Atom());
         CascadeToArrayList ctal = new CascadeToArrayList();
         ctal.al = new ArrayList();
         ctal.al.Add(new Atom("stored1"));
         ctal.al.Add(new Atom(new Atom("storedChild1"), "stored2"));
         Tester.store(ctal);
      }
      
      public void test() {
         Tester.forEach(this, new VisitorCAL1());
         Tester.reOpen();
         Tester.forEach(this, new VisitorCAL2());
         Tester.reOpen();
         Tester.deleteAllInstances(this);
         Tester.ensureOccurrences(new Atom(), 1);
      }
   }

		public class VisitorCAL1:Visitor4
		{
            public void visit(Object obj) {
               CascadeToArrayList ctal = (CascadeToArrayList)obj;
               IEnumerator i1 = ctal.al.GetEnumerator();
               while (i1.MoveNext()) {
                  Atom atom1 = (Atom)i1.Current;
                  atom1.name = "updated";
                  if (atom1.child != null) {
                     atom1.child.name = "updated";
                  }
               }
               Tester.store(ctal);
            }
		}



		public class VisitorCAL2:Visitor4
		{
             public void visit(Object obj) {
               CascadeToArrayList ctal = (CascadeToArrayList)obj;
               IEnumerator i1 = ctal.al.GetEnumerator();
               while (i1.MoveNext()) {
                  Atom atom1 = (Atom)i1.Current;
                  Tester.ensure(atom1.name.Equals("updated"));
                  if (atom1.child != null) {
                     Tester.ensure(!atom1.child.name.Equals("updated"));
                  }
               }
            }
		}


}