[commit] r2787 - in trunk: Doc GME/Mga Tests/GPyUnit

GMESRC Repository Notifications gme-commit at list.isis.vanderbilt.edu
Tue Apr 7 10:44:43 CDT 2020


Author: ksmyth
Date: Tue Apr  7 10:44:43 2020
New Revision: 2787

Log:
Fix 'Do you want to save' dialog appearing when no changes have been applied

Modified:
   trunk/Doc/README_in.txt
   trunk/GME/Mga/MgaFCO.cpp
   trunk/GME/Mga/MgaFCO.h
   trunk/GME/Mga/MgaProject.cpp
   trunk/GME/Mga/MgaProject.h
   trunk/GME/Mga/MgaTrukk.h
   trunk/Tests/GPyUnit/test_coreTransaction.py

Modified: trunk/Doc/README_in.txt
==============================================================================
--- trunk/Doc/README_in.txt	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/Doc/README_in.txt	Tue Apr  7 10:44:43 2020	(r2787)
@@ -25,6 +25,11 @@
 1. Release Notes
 ************************************************
 
+Release Notes
+----------------------------------
+  - Binary compatibility with 11.12.2
+  - Fix bug where 'Do you want to save?' dialog appears too often
+
 Release Notes of Release 20.2.12
 ----------------------------------
   - Binary compatibility with 11.12.2

Modified: trunk/GME/Mga/MgaFCO.cpp
==============================================================================
--- trunk/GME/Mga/MgaFCO.cpp	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/GME/Mga/MgaFCO.cpp	Tue Apr  7 10:44:43 2020	(r2787)
@@ -80,7 +80,7 @@
 //throws!!
 long FCO::getstatus() {
 		if(!mgaproject) COMTHROW(E_MGA_ZOMBIE_NOPROJECT);
-		if(!mgaproject->opened) COMTHROW(E_MGA_ZOMBIE_CLOSED_PROJECT);
+		if(!mgaproject->opened_flag) COMTHROW(E_MGA_ZOMBIE_CLOSED_PROJECT);
 		if(!mgaproject->activeterr) COMTHROW(E_MGA_NOT_IN_TRANSACTION);
 		VARIANT_BOOL pp;
 		if(self->get_IsDeleted(&pp) != S_OK) return OBJECT_ZOMBIE;

Modified: trunk/GME/Mga/MgaFCO.h
==============================================================================
--- trunk/GME/Mga/MgaFCO.h	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/GME/Mga/MgaFCO.h	Tue Apr  7 10:44:43 2020	(r2787)
@@ -322,6 +322,8 @@
 private:
 //Notification
 	unsigned long changemask, notifymask, temporalmask;
+	// CMgaProject needs changemask
+	friend class CMgaProject;
 
 // PreDelete Notification by Tihamer for the PAMS SynchTool
 	void PreDeleteNotify();

Modified: trunk/GME/Mga/MgaProject.cpp
==============================================================================
--- trunk/GME/Mga/MgaProject.cpp	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/GME/Mga/MgaProject.cpp	Tue Apr  7 10:44:43 2020	(r2787)
@@ -23,7 +23,7 @@
 #ifdef DEBUG
 			MGA_TRACE("Constructed: %s - %08X\n", sig, this);
 #endif
-			opened = CLOSED;
+			opened_flag = OPENED_FLAG_CLOSED;
 			dataproject = NULL;
 			preferences = 0;
 			opmask = 0x0026662A;
@@ -56,7 +56,7 @@
 #endif
 		MARKSIG('9'); 
 		ASSERT(allterrs.empty());
-		if(opened != CLOSED) { 
+		if(opened_flag != OPENED_FLAG_CLOSED) {
 			Close();
 		}
 }
@@ -122,7 +122,6 @@
 			COMTHROW(metapr->get_RootFolder(&mf));
 			COMTHROW(mf->get_MetaRef(&mr));
 			rootfolder[ATTRID_META] = mr;
-			notifyqueueprocessed = true;
 		} COMCATCH_IN_TRANSACTION(;);
 
 }
@@ -195,7 +194,7 @@
 
 STDMETHODIMP CMgaProject::CreateEx(BSTR projectname, BSTR paradigmname, VARIANT paradigmGUID) {
 	COMTRY {
-		if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+		if(opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
 
 		mgaversion = 2;
 			// Set generic for meta
@@ -208,7 +207,7 @@
 	
 		int undosize = getMaxUndoSize();
 		COMTHROW(dataproject->CreateProject2(projectname, undosize, genericproject));
-		opened = UNCHANGED;
+		opened_flag = OPENED_FLAG_UNCHANGED;
 		guidstat = DIRTY;
 
 	    CComPtr<IMgaTerritory> lm;
@@ -251,7 +250,7 @@
 		MARKSIG('2');
 	}
 	COMCATCH(
-		opened = CLOSED;
+		opened_flag = OPENED_FLAG_CLOSED;
 		guidstat = CLEAN;
 		if (dataproject) {
 			dataproject->CloseProject(VARIANT_TRUE);
@@ -277,7 +276,7 @@
 // if no guid change skip check
 STDMETHODIMP CMgaProject::OpenEx(BSTR projectname, BSTR paradigmname, VARIANT paradigmGUID) {
 	COMTRY {
-		if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+		if(opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
 		CComBSTR s;
 		CComVariant pGUID;
 		CComBSTR ver;
@@ -290,7 +289,7 @@
 		
 		projconn = projectname;
 
-		opened = UNCHANGED;
+		opened_flag = OPENED_FLAG_UNCHANGED;
 		guidstat = CLEAN;
 	    CComPtr<IMgaTerritory> lm;
 	    COMTHROW(CreateTerritory(NULL, &lm));
@@ -302,8 +301,8 @@
 			COMTHROW(dataproject->get_RootObject(&dataroot.ComPtr()));
 		    s=dataroot[ATTRID_PARADIGM];
 			mgaversion = dataroot[ATTRID_MGAVERSION];
-			if( mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
-				opened = CHANGED;
+			if (mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
+				opened_flag = OPENED_FLAG_CHANGED;
 
 			pGUID=CComVariant(dataroot[ATTRID_PARGUID]);
 			ver = dataroot[ATTRID_PARVERSION];
@@ -376,7 +375,7 @@
 					dataroot[ATTRID_PARGUID] = pGUID;
 					dataroot[ATTRID_PARVERSION] = ver;
 					COMTHROW(CommitTransaction());
-					opened = CHANGED;
+					opened_flag = OPENED_FLAG_CHANGED;
 					guidstat = DIRTY;
 				} catch(hresult_exception &e) {
 					lm->Flush();
@@ -400,7 +399,7 @@
 		MARKSIG('2');
 	} 
 	COMCATCH(
-		opened = CLOSED;
+		opened_flag = OPENED_FLAG_CLOSED;
 		guidstat = CLEAN;
 		if (dataproject)
 			dataproject->CloseProject(VARIANT_TRUE);
@@ -419,7 +418,7 @@
 STDMETHODIMP CMgaProject::Open(BSTR projectname, VARIANT_BOOL *ro_mode)
 {
 	COMTRY {
-		if(opened != CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
+		if (opened_flag != OPENED_FLAG_CLOSED) COMTHROW(E_MGA_PROJECT_OPEN);
 		CComBSTR s;
 		CComVariant pGUID;
 		CComBSTR ver;
@@ -431,7 +430,7 @@
 		
 		projconn = projectname;
 
-		opened = UNCHANGED;
+		opened_flag = OPENED_FLAG_UNCHANGED;
 		guidstat = CLEAN;
 	    CComPtr<IMgaTerritory> lm;
 	    COMTHROW(CreateTerritory(NULL, &lm));
@@ -444,7 +443,7 @@
 		    s=dataroot[ATTRID_PARADIGM];
 			mgaversion = dataroot[ATTRID_MGAVERSION];
 			if( mgaversion <= 1L) // Core layer changed the project by adding ATTRID_GUID1..4 for CCoreBinFile
-				opened = CHANGED;
+				opened_flag = OPENED_FLAG_CHANGED;
 
 			pGUID=CComVariant(dataroot[ATTRID_PARGUID]);
 			ver=dataroot[ATTRID_PARVERSION];
@@ -498,7 +497,7 @@
 					COMTHROW(dataproject->get_RootObject(&dataroot.ComPtr()));
 					dataroot[ATTRID_PARGUID] = nGUID;
 					COMTHROW(CommitTransaction());
-					opened = CHANGED;
+					opened_flag = OPENED_FLAG_CHANGED;
 					guidstat = DIRTY;
 				} catch(hresult_exception &e) {
 					lm->Flush();
@@ -523,7 +522,7 @@
 		MARKSIG('2');
 	} 
 	COMCATCH(
-		opened = CLOSED;
+		opened_flag = OPENED_FLAG_CLOSED;
 		if (dataproject)
 			dataproject->CloseProject(VARIANT_TRUE);
 		if (metapr)
@@ -595,9 +594,9 @@
 			COMTHROW(CreateTerritory(NULL, &t));
 			// if mga_ver<=1 the Core layer changed the project by adding ATTRID_GUID1..4
 			// (mgaversion <= 1L) -> (opened >= CHANGED)
-			ASSERT( !(mgaversion <= 1L) || opened >= CHANGED);
+			ASSERT( !(mgaversion <= 1L) || opened_flag >= OPENED_FLAG_CHANGED);
 
-			if(opened >= CHANGED) {
+			if (opened_flag >= OPENED_FLAG_CHANGED) {
 				COMTHROW(BeginTransaction(t, TRANSACTION_GENERAL));
 				try {
 					CoreObj self;
@@ -616,14 +615,14 @@
 		if (FAILED(hr))
 			return hr;
 		if(CComBSTR(newname).Length()) {
-			if (!keepoldname) {
+			if (keepoldname == VARIANT_FALSE) {
 				projconn = newname;
-				opened = UNCHANGED;
+				opened_flag = OPENED_FLAG_UNCHANGED;
 				transactioncount = 0;
 			}
 
 		} else {
-			opened = UNCHANGED;
+			opened_flag = OPENED_FLAG_UNCHANGED;
 			transactioncount = 0;
 		}
 	}
@@ -632,7 +631,7 @@
 
 STDMETHODIMP CMgaProject::Close(VARIANT_BOOL abort)
 {
-	if(opened == CLOSED) {
+	if (opened_flag == OPENED_FLAG_CLOSED) {
 		ASSERT(("Project is closed but transaction is active", !baseterr));
 		return S_OK;
 	}
@@ -642,7 +641,7 @@
 		{
 			CComPtr<IMgaTerritory> t;
 			COMTHROW(CreateTerritory(NULL, &t));
-			bool write = !abort && opened >= CHANGED;
+			bool write = !abort && opened_flag >= OPENED_FLAG_CHANGED;
 			COMTHROW(BeginTransaction(t, write ? TRANSACTION_GENERAL : TRANSACTION_READ_ONLY));
 			try {
 				if(write) {
@@ -669,13 +668,13 @@
 		}
 
 	    MARKSIG('8');
-		opened = CLOSED;
+		opened_flag = OPENED_FLAG_CLOSED;
 		guidstat = CLEAN;
 		projconn.Empty(); 
 		parconn.Empty();
 		transactioncount = 0;
 	}
-	COMCATCH( opened = CLOSEERROR;);	//  You cannot rollback a failed Close completely, so I did not even try it.
+	COMCATCH( opened_flag = OPENED_FLAG_CLOSEERROR;);	//  You cannot rollback a failed Close completely, so I did not even try it.
 }
 
 #undef mgaproject
@@ -907,7 +906,6 @@
 		CoreObj self;
 		COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
 		self[ATTRID_CREATOR] = newVal;
-		notifyqueueprocessed = true;
 		COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
     }
     COMCATCH_IN_TRANSACTION(;);
@@ -1008,7 +1006,6 @@
 
 		self[ATTRID_GUID] = newVal;
 		guidstat = MANUAL;
-		notifyqueueprocessed = true;
 		COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
     }
     COMCATCH_IN_TRANSACTION(;);
@@ -1033,7 +1030,6 @@
 		CoreObj self;
 		COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
 		self[ATTRID_EXTDATA] = newVal;
-		notifyqueueprocessed = true;
 		COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
     }
     COMCATCH_IN_TRANSACTION(;);
@@ -1047,7 +1043,6 @@
 		CoreObj self;
 		COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
 		self[ATTRID_NAME] = newVal;
-		notifyqueueprocessed = true;
 		COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
     }
     COMCATCH_IN_TRANSACTION(;);
@@ -1061,7 +1056,6 @@
 		CoreObj self;
 		COMTHROW(dataproject->get_RootObject(&self.ComPtr()));
 		self[ATTRID_VERSION] = newVal;
-		notifyqueueprocessed = true;
 		COMTHROW(GlobalNotify(GLOBALEVENT_PROJECT_PROPERTIES));
     }
     COMCATCH_IN_TRANSACTION(;);
@@ -1271,7 +1265,7 @@
 		bool bnew = (bEnable == VARIANT_TRUE);
 		if(bnew == autoaddons) return S_OK;
 		autoaddons = bnew;
-		if(opened != CLOSED) {
+		if (opened_flag != OPENED_FLAG_CLOSED) {
 			if(autoaddons) StartAutoAddOns();
 			else StopAutoAddOns();
 		}
@@ -1373,14 +1367,14 @@
 STDMETHODIMP CMgaProject::get_ProjectStatus(long *status) {
 	COMTRY {
 		CHECK_OUTPAR(status);
-		if(opened == CLOSED) {
+		if (opened_flag == OPENED_FLAG_CLOSED) {
 			*status  = 0;
 		}	
-		else if(opened == CLOSEERROR) {
+		else if(opened_flag == OPENED_FLAG_CLOSEERROR) {
 			*status = 0x80000000;
 		}
 		else {
-			*status = 1 + (opened == CHANGED ? 4 : 0) + (baseterr ? 8 : 0) + (read_only ? 16 : 0);
+			*status = 1 + (opened_flag == OPENED_FLAG_CHANGED ? 4 : 0) + (baseterr ? 8 : 0) + (read_only ? 16 : 0);
 		}
 	} COMCATCH(;);
 }
@@ -1425,7 +1419,6 @@
 		if (FAILED(hr))
 			COMRETURN(hr);
 		baseterr = activeterr = t;
-		notifyqueueprocessed = false;
 		MARKSIG('3');
     }
     COMCATCH(;);
@@ -1487,13 +1480,20 @@
 		COMTHROW(dataproject->get_NestedTransactionCount(&nestedCount));
 		if (nestedCount == 1 && !read_only)
 			COMTHROW(GlobalNotify(GLOBALEVENT_COMMIT_TRANSACTION));
+
+
+		short undosize;
+		short undosizenew;
+		COMTHROW(dataproject->get_UndoQueueSize(&undosize));
 		COMTHROW(dataproject->CommitTransaction(read_only ? TRANSTYPE_READFIRST: TRANSTYPE_FIRST));
-        baseterr = activeterr= NULL;
+		COMTHROW(dataproject->get_UndoQueueSize(&undosizenew));
+		baseterr = activeterr= NULL;
 		read_only = false;
 
-		if(notifyqueueprocessed) {
+		if (undosize != undosizenew) {
+			// this means there were changes to the core project, and we can undo this transaction
 			transactioncount++;
-			opened = CHANGED;
+			opened_flag = OPENED_FLAG_CHANGED;
 			if (guidstat == MANUAL) {
 				guidstat = CLEAN;
 			}
@@ -1622,8 +1622,6 @@
                 if(!baseterr)
 					COMTHROW(E_MGA_NOT_IN_TRANSACTION);
 
-                if(!changedobjs.empty())
-					notifyqueueprocessed = true;
                 while(!changedobjs.empty()) {
                                 FCOPtr f = changedobjs.front();
                                 changedobjs.pop();
@@ -1657,7 +1655,7 @@
 	ASSERT(!in_nested);
 
 	ASSERT(objstocheck.empty());
-	objstocheck.clear();		
+	objstocheck.clear();
 
 	HRESULT hr;
 	if (non_nestable)
@@ -1665,7 +1663,7 @@
 	else
 		hr = dataproject->BeginTransaction(TRANSTYPE_NESTED);
 
-    MARKSIG('4');
+	MARKSIG('4');
 	if (hr == S_OK)
 		in_nested = true;
 	return hr;
@@ -1680,12 +1678,12 @@
 	HRESULT hr = S_OK;
 	if (!non_nestable)
 		hr = dataproject->CommitTransaction(TRANSTYPE_NESTED);
-    MARKSIG('6');
+	MARKSIG('6');
 	if (hr != S_OK)
 		abortnested();
-	else { 
+	else {
 		in_nested = false;
-		while(!temporalobjs.empty()) {
+		while (!temporalobjs.empty()) {
 			temporalobjs.front()->objrecordchange();
 			temporalobjs.pop();
 		}
@@ -1697,11 +1695,11 @@
 	ASSERT(in_nested);
 	objstocheck.clear();
 	in_nested = false;
-	while(!temporalobjs.empty()) {
-			temporalobjs.front()->objforgetchange();
-			temporalobjs.pop();
+	while (!temporalobjs.empty()) {
+		temporalobjs.front()->objforgetchange();
+		temporalobjs.pop();
 	}
-    MARKSIG('5');
+	MARKSIG('5');
 	must_abort = true;
 	if (non_nestable)
 		return S_OK;
@@ -1711,16 +1709,16 @@
 
 
 HRESULT CMgaProject::pushterr(CMgaTerritory &ter) {
-	COMTRY {
-		ASSERT(("Territorys overwrite each other",activeterr==baseterr));
+	COMTRY{
+		ASSERT(("Territorys overwrite each other",activeterr == baseterr));
 		activeterr = &ter;
 		COMTHROW(dataproject->PushTerritory(ter.coreterr));
 	} COMCATCH(;);
 }
 
 HRESULT CMgaProject::popterr() {
-	COMTRY {
-		activeterr= baseterr;
+	COMTRY{
+		activeterr = baseterr;
 		COMTHROW(dataproject->PopTerritory());
 	} COMCATCH(;);
 }
@@ -1728,13 +1726,18 @@
 
 
 STDMETHODIMP CMgaProject::Undo() {
-	COMTRY {
-		if(baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
+	COMTRY{
+		if (baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
 		COMTHROW(dataproject->UndoTransaction());
-		if(!--transactioncount) {
-			opened = UNCHANGED;
+		transactioncount--;
+		if (transactioncount == 0) {
+			opened_flag = OPENED_FLAG_UNCHANGED;
 			guidstat = CLEAN;
 		}
+		else {
+			opened_flag = OPENED_FLAG_CHANGED;
+			guidstat = DIRTY;
+		}
 		{
 			aurcnt++;
 			CComPtr<IMgaTerritory> t;
@@ -1743,18 +1746,25 @@
 			GlobalNotify(GLOBALEVENT_UNDO);
 			COMTHROW(CommitTransaction());
 		}
-    }
-    COMCATCH(;);
+	}
+	COMCATCH(;);
 }
 
 STDMETHODIMP CMgaProject::Redo() {
 
-	COMTRY {
-		if(baseterr) COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
+	COMTRY{
+		if (baseterr)
+			COMTHROW(E_MGA_ALREADY_IN_TRANSACTION);
 		COMTHROW(dataproject->RedoTransaction());
 		transactioncount++;
-		opened = CHANGED;
-		guidstat = DIRTY;
+		if (transactioncount == 0) {
+			opened_flag = OPENED_FLAG_UNCHANGED;
+			guidstat = CLEAN;
+		} else {
+			opened_flag = OPENED_FLAG_CHANGED;
+			guidstat = DIRTY;
+		}
+
 		{
 			aurcnt++;
 			CComPtr<IMgaTerritory> t;

Modified: trunk/GME/Mga/MgaProject.h
==============================================================================
--- trunk/GME/Mga/MgaProject.h	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/GME/Mga/MgaProject.h	Tue Apr  7 10:44:43 2020	(r2787)
@@ -229,11 +229,10 @@
 	CComVariant pendingguid;
 	enum guidmodes { CLEAN, DIRTY, PENDING, MANUAL};
 
-	enum openmodes { CLOSED = 0, UNCHANGED = 1, CHANGED = 2, CLOSEERROR = 4}; 
+	enum open_flags { OPENED_FLAG_CLOSED = 0, OPENED_FLAG_UNCHANGED = 1, OPENED_FLAG_CHANGED = 2, OPENED_FLAG_CLOSEERROR = 4};
 	int transactioncount;
-	bool notifyqueueprocessed;
 
-	int opened;
+	int opened_flag;
 	int aurcnt;   // Abort/undo/redo count
 	coreobjhash objstocheck;
 

Modified: trunk/GME/Mga/MgaTrukk.h
==============================================================================
--- trunk/GME/Mga/MgaTrukk.h	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/GME/Mga/MgaTrukk.h	Tue Apr  7 10:44:43 2020	(r2787)
@@ -280,7 +280,7 @@
 public:
 	HRESULT Begin(CMgaProject *ppr) {
 		if(!ppr) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_NOPROJECT); return E_MGA_ZOMBIE_NOPROJECT; }
-		if(!ppr->opened) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_CLOSED_PROJECT); return E_MGA_ZOMBIE_CLOSED_PROJECT; }
+		if(!ppr->opened_flag) { SetStandardOrGMEErrorInfo(E_MGA_ZOMBIE_CLOSED_PROJECT); return E_MGA_ZOMBIE_CLOSED_PROJECT; }
 		if(!ppr->activeterr) { SetStandardOrGMEErrorInfo(E_MGA_NOT_IN_TRANSACTION); return E_MGA_NOT_IN_TRANSACTION; }
 		if(ppr->alreadynested()) {
 			pr = NULL;
@@ -418,9 +418,6 @@
   } while(0);
 
 
-
-#define MODIFIED	{ if(mgaproject->opened < 1000) mgaproject->opened++; }
-
 #undef COMCATCH
 #define COMCATCH( CLEANUP )  \
 	catch(hresult_exception &e) \

Modified: trunk/Tests/GPyUnit/test_coreTransaction.py
==============================================================================
--- trunk/Tests/GPyUnit/test_coreTransaction.py	Tue Apr  7 10:44:39 2020	(r2786)
+++ trunk/Tests/GPyUnit/test_coreTransaction.py	Tue Apr  7 10:44:43 2020	(r2787)
@@ -106,6 +106,50 @@
         project.Close(True)
         del(terr)
 
+    def testModificationDetection(self):
+        project = DispatchEx('Mga.MgaProject')
+        project.Create(self.connstr, 'MetaGME')
+        paradigmSheet = project.RootMeta.RootFolder.DefinedFCOByName('ParadigmSheet', True)
+        self.assertEquals(project.ProjectStatus & 4, 4)
+        project.Preferences = 0x00000080
+        project.BeginTransactionInNewTerr()
+        base = project.RootFolder.CreateRootObject(paradigmSheet)
+        base.CreateChildObject(paradigmSheet.RoleByName('Atom'))
+        for i in range(20):
+            base.ParentFolder.DeriveRootObject(base, True)
+        base_id = base.ID
+        project.CommitTransaction()
+
+        self.assertEquals(project.UndoRedoSize(), (1, 0))
+        self.assertEquals(project.ProjectStatus & 4, 4)
+
+        for i in range(1, 20):
+            terr = project.BeginTransactionInNewTerr()
+            base = project.GetObjectByID(base_id)
+            derived = base.DerivedObjects.Item(i)
+            base.SetRegistryValueDisp('random', 'asdf')
+            base.Name = 'super'
+            project.CommitTransaction()
+            self.assertEquals(project.ProjectStatus & 4, 4)
+            if i == 11:
+                project.Save(project.ProjectConnStr, False)
+                self.assertEquals(project.ProjectStatus & 4, 0)
+        for i in range(7):
+            project.Undo()
+            self.assertEquals(project.ProjectStatus & 4, 4)
+        project.Undo()
+        self.assertEquals(project.ProjectStatus & 4, 0)
+        project.Redo()
+        self.assertEquals(project.ProjectStatus & 4, 4)
+        project.Undo()
+        self.assertEquals(project.ProjectStatus & 4, 0)
+        project.Undo()
+        self.assertEquals(project.ProjectStatus & 4, 4)
+        project.Redo()
+        self.assertEquals(project.ProjectStatus & 4, 0)
+        project.Close(True)
+
+
     @property
     def connstr(self):
         return 'MGA=' + _adjacent_file('tmp.mga')


More information about the gme-commit mailing list