From 26f0afb89d8c64c69b5e0efa6b5f0d95e58f0246 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Mon, 3 May 2010 10:53:15 +0000
Subject: [PATCH] Added unit tests and fix for add/remove residue to chainview

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2168 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/mol/base/src/chain_view.cc     | 12 +++++++----
 modules/mol/base/tests/test_residue.cc | 28 +++++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc
index bb6562c9c..fac143b85 100644
--- a/modules/mol/base/src/chain_view.cc
+++ b/modules/mol/base/src/chain_view.cc
@@ -221,17 +221,21 @@ void ChainView::RemoveResidue(ResidueView view) {
   if (!view.IsValid())
     return;
   view.RemoveAtoms();
-  int index = view.GetIndex();
   ResidueViewList::iterator i=data_->residues.begin();
   for (; i!=data_->residues.end(); ++i) {
-    int res_index = (*i).GetIndex();
     if (*i==view) {
-      data_->residues.erase(i);
+      break;
     }
-    else if(index < res_index){
+  }
+  ResidueViewList::iterator to_del = i;
+  int index = view.GetIndex();
+  for(; i!=data_->residues.end(); ++i) {
+    int res_index = (*i).GetIndex();
+    if(index < res_index){
       (*i).SetIndex(res_index-1);
     }
   }
+  data_->residues.erase(to_del);
 }
 
 ResidueView ChainView::AddResidue(const ResidueView& residue_view, 
diff --git a/modules/mol/base/tests/test_residue.cc b/modules/mol/base/tests/test_residue.cc
index 5b5dea5eb..332d60edd 100644
--- a/modules/mol/base/tests/test_residue.cc
+++ b/modules/mol/base/tests/test_residue.cc
@@ -45,4 +45,30 @@ BOOST_AUTO_TEST_CASE(test_in_sequence)
   BOOST_CHECK(!InSequence(rA,rC));
 }
 
-BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
+BOOST_AUTO_TEST_CASE(test_res_index)
+{
+  EntityHandle eh=CreateEntity();
+  XCSEditor e=eh.RequestXCSEditor();
+  ChainHandle ch1=e.InsertChain("A");
+  ResidueHandle rA = e.AppendResidue(ch1, "A");
+  ResidueHandle rB = e.AppendResidue(ch1, "B");
+  ResidueHandle rC = e.AppendResidue(ch1, "C");
+  EntityView v(eh);
+  ChainView cv1(v, ch1);
+  ResidueView rvA = cv1.AddResidue(rA);
+  ResidueView rvB = cv1.AddResidue(rB);
+  ResidueView rvC = cv1.AddResidue(rC);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),0);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber()));
+  BOOST_CHECK_EQUAL(rvB.GetIndex(),1);
+  BOOST_CHECK_EQUAL(rvB.GetIndex(),cv1.GetResidueIndex(rvB.GetNumber()));
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),2);
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber()));
+  cv1.RemoveResidue(rvB);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),0);
+  BOOST_CHECK_EQUAL(rvA.GetIndex(),cv1.GetResidueIndex(rvA.GetNumber()));
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),1);
+  BOOST_CHECK_EQUAL(rvC.GetIndex(),cv1.GetResidueIndex(rvC.GetNumber()));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
-- 
GitLab