Changes in / [255971:d223d5]


Ignore:
Files:
2 added
44 edited

Legend:

Unmodified
Added
Removed
  • Makefile.am

    r255971 rd223d5  
    99doc:
    1010        cd doc && make doxygen-docs
     11       
     12unity:
     13        cd src && make unity
  • src/Actions/AnalysisAction/PointCorrelationAction.hpp

    r255971 rd223d5  
    1111#include "Actions/Action.hpp"
    1212#include "LinearAlgebra/Vector.hpp"
     13#include <vector>
     14#include <string>
    1315
    1416class element;
  • src/Actions/CmdAction/FastParsingAction.cpp

    r255971 rd223d5  
    7878
    7979Action::state_ptr CommandLineFastParsingAction::performRedo(Action::state_ptr _state){
    80   performUndo(_state);
     80  return performUndo(_state);
    8181}
    8282
  • src/Actions/CmdAction/VerboseAction.cpp

    r255971 rd223d5  
    7676
    7777Action::state_ptr CommandLineVerboseAction::performRedo(Action::state_ptr _state){
    78   performUndo(_state);
     78  return performUndo(_state);
    7979}
    8080
  • src/Actions/FragmentationAction/SubgraphDissectionAction.hpp

    r255971 rd223d5  
    77
    88#ifndef SUBGRAPHDISSECTIONACTION_HPP_
    9 #define SUBGRAPHDISSECTIONACTION_HPP_f
     9#define SUBGRAPHDISSECTIONACTION_HPP_
    1010
    1111#include "Actions/Action.hpp"
  • src/Actions/Makefile.am

    r255971 rd223d5  
    209209pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    210210
     211unity.cpp:
     212        echo "" >  unity.cpp; \
     213        list='$(ACTIONSSOURCE)'; for file in $$list; do \
     214          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     215        done;
     216       
     217MOSTLYCLEANFILES = unity.cpp
  • src/Actions/MapOfActions.hpp

    r255971 rd223d5  
    1010
    1111#include <boost/program_options.hpp>
     12#include <boost/lexical_cast.hpp>
    1213
    1314#include <map>
  • src/Actions/SelectionAction/NotAllAtomsAction.cpp

    r255971 rd223d5  
    2828// memento to remember the state when undoing
    2929
    30 class SelectionAllAtomsState : public ActionState {
     30class SelectionNotAllAtomsState : public ActionState {
    3131public:
    32   SelectionAllAtomsState(std::vector<atom*> _selectedAtoms) :
     32  SelectionNotAllAtomsState(std::vector<atom*> _selectedAtoms) :
    3333    selectedAtoms(_selectedAtoms)
    3434  {}
     
    6161  DoLog(1) && (Log() << Verbose(1) << "Unselecting all atoms." << endl);
    6262  World::getInstance().clearAtomSelection();
    63   return Action::state_ptr(new SelectionAllAtomsState(selectedAtoms));
     63  return Action::state_ptr(new SelectionNotAllAtomsState(selectedAtoms));
    6464}
    6565
    6666Action::state_ptr SelectionNotAllAtomsAction::performUndo(Action::state_ptr _state) {
    67   SelectionAllAtomsState *state = assert_cast<SelectionAllAtomsState*>(_state.get());
     67  SelectionNotAllAtomsState *state = assert_cast<SelectionNotAllAtomsState*>(_state.get());
    6868
    6969  World::getInstance().clearAtomSelection();
     
    7171    World::getInstance().selectAtom(*iter);
    7272
    73   return Action::state_ptr(new SelectionAllAtomsState(state->selectedAtoms));
     73  return Action::state_ptr(new SelectionNotAllAtomsState(state->selectedAtoms));
    7474}
    7575
    7676Action::state_ptr SelectionNotAllAtomsAction::performRedo(Action::state_ptr _state){
    77   SelectionAllAtomsState *state = assert_cast<SelectionAllAtomsState*>(_state.get());
     77  SelectionNotAllAtomsState *state = assert_cast<SelectionNotAllAtomsState*>(_state.get());
    7878
    7979  World::getInstance().clearAtomSelection();
    8080
    81   return Action::state_ptr(new SelectionAllAtomsState(state->selectedAtoms));
     81  return Action::state_ptr(new SelectionNotAllAtomsState(state->selectedAtoms));
    8282}
    8383
  • src/Actions/WorldAction/SetDefaultNameAction.cpp

    r255971 rd223d5  
    7979
    8080Action::state_ptr WorldSetDefaultNameAction::performRedo(Action::state_ptr _state){
    81   performUndo(_state);
     81  return performUndo(_state);
    8282}
    8383
  • src/Actions/WorldAction/SetGaussianBasisAction.cpp

    r255971 rd223d5  
    7979
    8080Action::state_ptr WorldSetGaussianBasisAction::performRedo(Action::state_ptr _state){
    81   performUndo(_state);
     81  return performUndo(_state);
    8282}
    8383
  • src/Exceptions/Makefile.am

    r255971 rd223d5  
    7272pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    7373
     74unity.cpp:
     75        echo "" >  unity.cpp; \
     76        list='$(EXCEPTIONSOURCE)'; for file in $$list; do \
     77          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     78        done;
     79       
     80MOSTLYCLEANFILES = unity.cpp
  • src/Formula.cpp

    r255971 rd223d5  
    5555
    5656void Formula::fromString(const std::string &formula) throw(ParseError){
     57  // make this transactional, in case an error is thrown
     58  Formula res;
     59  string::const_iterator begin = formula.begin();
     60  string::const_iterator end = formula.end();
     61  res.parseFromString(begin,end,static_cast<char>(0));
     62  (*this)=res;
     63}
     64
     65int Formula::parseMaybeNumber(string::const_iterator &it,string::const_iterator &end) throw(ParseError){
     66  static const range<char> Numbers = makeRange('0',static_cast<char>('9'+1));
     67  int count = 0;
     68  while(it!=end && Numbers.isInRange(*it))
     69    count = (count*10) + ((*it++)-Numbers.first);
     70  // one is implicit
     71  count = (count!=0)?count:1;
     72  return count;
     73}
     74
     75void Formula::parseFromString(string::const_iterator &it,string::const_iterator &end,char delimiter) throw(ParseError){
    5776  // some constants needed for parsing... Assumes ASCII, change if other encodings are used
    5877  static const range<char> CapitalLetters = makeRange('A',static_cast<char>('Z'+1));
    5978  static const range<char> SmallLetters = makeRange('a',static_cast<char>('z'+1));
    60   static const range<char> Numbers = makeRange('0',static_cast<char>('9'+1));
     79  map<char,char> delimiters;
     80  delimiters['('] = ')';
     81  delimiters['['] = ']';
    6182  // clean the formula
    6283  clear();
    63   string::const_iterator end = formula.end(); // will be used frequently
    64   for(string::const_iterator it=formula.begin();it!=end;){
     84  for(/*send from above*/;it!=end && *it!=delimiter;/*updated in loop*/){
     85    // we might have a sub formula
     86    if(delimiters.count(*it)){
     87      Formula sub;
     88      char nextdelim=delimiters[*it];
     89      sub.parseFromString(++it,end,nextdelim);
     90      if(!sub.getElementCount()){
     91        throw(ParseError(__FILE__,__LINE__));
     92      }
     93      int count = parseMaybeNumber(++it,end);
     94      addFormula(sub,count);
     95      continue;
     96    }
    6597    string shorthand;
    6698    // Atom names start with a capital letter
     
    71103    while(it!=end && SmallLetters.isInRange(*it))
    72104      shorthand+=(*it++);
    73     // now we can count the occurences
    74     int count = 0;
    75     while(it!=end && Numbers.isInRange(*it))
    76       count = (count*10) + ((*it++)-Numbers.first);
    77     // one is implicit
    78     count = (count!=0)?count:1;
     105    int count = parseMaybeNumber(it,end);
    79106    // test if the shorthand exists
    80107    if(!World::getInstance().getPeriode()->FindElement(shorthand))
     
    83110    addElements(shorthand,count);
    84111  }
     112  if(it==end && delimiter!=0){
     113    throw(ParseError(__FILE__,__LINE__));
     114  }
    85115}
    86116
     
    93123    *output << "#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\t# chemical name, symbol" << endl;
    94124    for(const_iterator iter=begin(); iter!=end();++iter){
    95       (*iter).first->No = No;
    96125      result = result && (*iter).first->Checkout(output, No++, (*iter).second);
    97126    }
     
    195224}
    196225
     226void Formula::addFormula(const Formula &formula,unsigned int n){
     227  for(Formula::const_iterator iter=formula.begin();iter!=formula.end();++iter){
     228    this->addElements(iter->first,iter->second*n);
     229  }
     230}
     231
     232enumeration<Formula::key_type> Formula::enumerateElements() const{
     233  enumeration<key_type> res(1);
     234  for(Formula::const_iterator iter=begin();iter!=end();++iter){
     235    res.add(iter->first);
     236  }
     237  return res;
     238}
     239
    197240const unsigned int Formula::operator[](const element *element) const{
    198241  ASSERT(element,"Invalid pointer in access of Formula");
  • src/Formula.hpp

    r255971 rd223d5  
    1616
    1717#include "types.hpp"
     18#include "Helpers/helpers.hpp"
    1819
    1920class element;
     
    2223{
    2324public:
    24   typedef element*                                      key_type;
     25  typedef const element*                                key_type;
    2526  typedef unsigned int                                  mapped_type;
    2627  typedef std::pair<key_type, mapped_type>              value_type;
     
    6566
    6667  unsigned int getElementCount() const;
    67   bool hasElement(const element*)       const;
     68  bool hasElement(key_type)             const;
    6869  bool hasElement(atomicNumber_t)       const;
    6970  bool hasElement(const std::string&)   const;
    7071
    71   void operator+=(const element*);
     72  void operator+=(key_type);
    7273  void operator+=(atomicNumber_t);
    7374  void operator+=(const std::string&);
    7475
    75   void operator-=(const element*);
     76  void operator-=(key_type);
    7677  void operator-=(atomicNumber_t);
    7778  void operator-=(const std::string&);
    7879
    79   void addElements(const element*,unsigned int);
     80  void addElements(key_type,unsigned int);
    8081  void addElements(atomicNumber_t,unsigned int);
    8182  void addElements(const std::string&,unsigned int);
    8283
     84  void addFormula(const Formula&,unsigned int);
     85
     86  enumeration<key_type> enumerateElements() const;
     87
    8388  // only const versions, because someone might try to increment a previously
    8489  // not set element
    85   const unsigned int operator[](const element*) const;
     90  const unsigned int operator[](key_type) const;
    8691  const unsigned int operator[](atomicNumber_t) const;
    8792  const unsigned int operator[](std::string)    const;
     
    98103
    99104private:
     105  void parseFromString(std::string::const_iterator&,std::string::const_iterator&,char) throw(ParseError);
     106  int parseMaybeNumber(std::string::const_iterator &it,std::string::const_iterator &end) throw(ParseError);
    100107  // this contains all counts of elements in the formula
    101108  // the size of the actual structure might be used in comparisons
  • src/Helpers/Assert.cpp

    r255971 rd223d5  
    55 *      Author: crueger
    66 */
    7 
    8 #include "Helpers/MemDebug.hpp"
    97
    108#include "Helpers/Assert.hpp"
     
    4644}
    4745
    48 using namespace Assert;
    49 
    5046#ifndef NDEBUG
    5147
    52 Action _my_assert::defaultAction = Ask;
    53 std::vector<Assert::hook_t> _my_assert::hooks;
     48#ifdef __GNUC__
     49#include <cstdlib>
     50#include <execinfo.h>
     51#include <cxxabi.h>
     52#endif
    5453
    55 std::map<std::string,bool> _wrapper::ignores;
    56 const char* _wrapper::message_ptr = "source pointer did not point to object of desired type";
    57 const char* _wrapper::message_ref = "source reference did not contain object of desired type";
     54Assert::Action Assert::_my_assert::defaultAction = Ask;
     55std::vector<Assert::hook_t> Assert::_my_assert::hooks;
    5856
     57std::map<std::string,bool> Assert::_wrapper::ignores;
     58const char* Assert::_wrapper::message_ptr = "source pointer did not point to object of desired type";
     59const char* Assert::_wrapper::message_ref = "source reference did not contain object of desired type";
    5960
    60 bool _my_assert::check(const bool res,
    61                        const char* condition,
    62                        const char* message,
    63                        const char* filename,
    64                        const int line,
    65                        bool& ignore)
     61bool Assert::_my_assert::check(const char* condition,
     62                               const char* message,
     63                               const char* filename,
     64                               const int line,
     65                               bool& ignore)
    6666{
    67   if(!res){
    68     cout << "Assertion \"" << condition << "\" failed in file " << filename << " at line " << line << endl;
    69     cout << "Assertion Message: " << message << std::endl;
    70     while(true){
    71       char choice;
    72       if(defaultAction==Ask) {
    73         cout << "Please choose: (a)bort, (t)hrow execption, (i)gnore, al(w)ays ignore" << endl;
    74         cin >> choice;
    75       }
    76       else{
    77         choice = ActionKeys[defaultAction];
    78       }
    79       switch(choice){
    80         case 'a':
    81           return true;
    82           break;
    83         case 't':
    84           throw AssertionFailure(condition,filename,line,message);
    85           break;
    86         case 'w':
    87           ignore = true;
    88           // fallthrough
    89         case 'i':
    90           return false;
    91           break;
    92       }
     67  cout << "Assertion \"" << condition << "\" failed in file " << filename << " at line " << line << endl;
     68  cout << "Assertion Message: " << message << std::endl;
     69  while(true){
     70    char choice;
     71    if(defaultAction==Assert::Ask) {
     72#ifdef __GNUC__
     73      cout << "Please choose: (a)bort, (t)hrow execption, show (b)actrace, (i)gnore, al(w)ays ignore" << endl;
     74#else
     75      cout << "Please choose: (a)bort, (t)hrow execption, (i)gnore, al(w)ays ignore" << endl;
     76#endif /* __GNUC__ */
     77      cin >> choice;
     78    }
     79    else{
     80      choice = ActionKeys[defaultAction];
     81    }
     82    switch(choice){
     83      case 'a':
     84        return true;
     85        break;
     86      case 't':
     87        throw AssertionFailure(condition,filename,line,message);
     88        break;
     89#ifdef __GNUC__
     90      case 'b':
     91        Assert::_my_assert::backtrace(filename,line);
     92       break;
     93#endif /* __GNUC__ */
     94      case 'w':
     95        ignore = true;
     96        // fallthrough
     97      case 'i':
     98        return false;
     99        break;
    93100    }
    94101  }
     
    96103}
    97104
    98 void _my_assert::doHooks(){
     105#ifdef __GNUC__
     106void Assert::_my_assert::backtrace(const char *file, int line){
     107  const size_t max_depth = 100;
     108  void* stack_addrs[max_depth];
     109  size_t stack_depth;
     110  char **stack_strings=0;
     111  const char *func_name=0;
     112  size_t sz = 64;
     113
     114  // get the backtrace
     115  stack_depth   = ::backtrace(stack_addrs,max_depth);
     116  stack_strings = backtrace_symbols(stack_addrs, stack_depth);
     117  // used later for demangling
     118  // reserved here, so we can free it unconditionally
     119  char *dm_function = static_cast<char*>(malloc(sz));
     120  if(!dm_function){
     121    // malloc failed... we are out of luck
     122    cout << "cannot provide stack trace due to exhausted memory" << endl;
     123    return;
     124  }
     125
     126  cout << "Backtrace from  " << file << "@" << line << ":" << endl;
     127
     128  // i=2 because we don't want this function, nor the assertion handler
     129  for(unsigned int i=2;i<stack_depth-2;++i){
     130    // find the mangled function name
     131    char *begin = stack_strings[i];
     132    // function name starts with a (
     133    while(*begin && *begin!='(') ++begin;
     134    char *end=begin;
     135    while(*end && *end!='+') ++end;
     136
     137    // see if we found our function name
     138    if(*begin && *end){
     139      *begin++ = 0;
     140      *end = 0;
     141      // use the C++ demangler
     142
     143      int status;
     144      char *func_ret = abi::__cxa_demangle(begin, dm_function, &sz, &status);
     145      if(func_ret){
     146        // abi might have realloced...
     147        dm_function = func_ret;
     148        func_name = dm_function;
     149      }
     150      else{
     151        // demangling failed... get the function name without demangling
     152        func_name = begin;
     153      }
     154    }
     155    else{
     156      // function name not found... get the whole line
     157      func_name = stack_strings[i];
     158    }
     159    cout << func_name << endl;
     160  }
     161  free(dm_function);
     162  free(stack_strings); // malloc()ed by backtrace_symbols
     163}
     164#endif /* __GNUC__ */
     165
     166void Assert::_my_assert::doHooks(){
    99167  for(vector<hook_t>::reverse_iterator iter = hooks.rbegin(); iter!=hooks.rend(); ++iter ){
    100168    (*iter)();
     
    102170}
    103171
    104 void _my_assert::addHook(hook_t hook){
     172void Assert::_my_assert::addHook(hook_t hook){
    105173  hooks.push_back(hook);
    106174}
    107175
    108 void _my_assert::removeHook(Assert::hook_t hook){
     176void Assert::_my_assert::removeHook(Assert::hook_t hook){
    109177  for(vector<hook_t>::iterator iter = hooks.begin(); iter!=hooks.end();){
    110178    if((*iter)==hook){
     
    117185}
    118186
    119 void _my_assert::setDefault(Assert::Action action){
     187void Assert::_my_assert::setDefault(Assert::Action action){
    120188  defaultAction = action;
    121189}
    122 Assert::Action _my_assert::getDefault(){
     190Assert::Action Assert::_my_assert::getDefault(){
    123191  return defaultAction;
    124192}
    125 std::string _my_assert::printDefault(){
     193std::string Assert::_my_assert::printDefault(){
    126194  return ActionNames[defaultAction];
    127195}
  • src/Helpers/Assert.hpp

    r255971 rd223d5  
    234234      static bool ignore = false;\
    235235      if(!ignore){\
    236         if(Assert::_my_assert::check((condition),STRINGIFY(condition),(message),\
    237                                      __FILE__,__LINE__,ignore)){\
     236        if(!(condition) && Assert::_my_assert::check(STRINGIFY(condition),(message),\
     237                                                     __FILE__,__LINE__,ignore)){\
    238238          Assert::_my_assert::doHooks();\
    239239          DEBUG_BREAK;\
     
    247247                  static bool ignore = false; \
    248248                  if(!ignore){\
    249                           if(Assert::_my_assert::check(false,"Exception caught",(message),__FILE__,__LINE__,ignore)){\
     249                          if(Assert::_my_assert::check("Exception caught",(message),__FILE__,__LINE__,ignore)){\
    250250                            Assert::_my_assert::doHooks();\
    251           DEBUG_BREAK;\
     251                            DEBUG_BREAK;\
    252252                          }\
    253253                  }\
     
    299299    class _my_assert{
    300300    public:
    301       static bool check(const bool res,
    302                         const char* condition,
     301      static bool check(const char* condition,
    303302                        const char* message,
    304303                        const char* filename,
    305304                        const int line,
    306305                        bool& ignore);
     306#ifdef __GNUC__
     307      static void backtrace(const char *file, int line);
     308#endif /* __GNUC__ */
    307309      static void addHook(Assert::hook_t hook);
    308310      static void removeHook(Assert::hook_t hook);
     
    332334
    333335      if(!ignore){
    334         if(_my_assert::check(dynamic_cast<target>(src)==static_cast<target>(src),"type-safe typecast",
    335                                        message_ptr,file,line,ignore)){
     336        bool res = dynamic_cast<target>(src)==static_cast<target>(src);
     337        if(!res && _my_assert::check("type-safe typecast",message_ptr,file,line,ignore)){
    336338          _my_assert::doHooks();
    337339          DEBUG_BREAK;
     
    354356      catch(...){
    355357        if(!ignore){
    356           if(_my_assert::check(0,"type-safe typecast",message_ref,file,line,ignore)){
     358          if(_my_assert::check("type-safe typecast",message_ref,file,line,ignore)){
    357359            _my_assert::doHooks();
    358360            DEBUG_BREAK;
  • src/Helpers/Log.hpp

    r255971 rd223d5  
    1212#include "Helpers/logger.hpp"
    1313
    14 class logger * Log();
    15 class errorLogger * eLog();
     14class logger & Log();
     15class errorLogger & eLog();
    1616void setVerbosity(int verbosityLevel);
    1717bool DoLog(int verbose);
  • src/Helpers/Makefile.am

    r255971 rd223d5  
    6969pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    7070
     71unity.cpp:
     72        echo "" >  unity.cpp; \
     73        list='$(HELPERSSOURCE)'; for file in $$list; do \
     74          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     75        done;
     76       
     77MOSTLYCLEANFILES = unity.cpp
  • src/Helpers/MemDebug.cpp

    r255971 rd223d5  
    7272  // all allocated memory blocks
    7373  struct entry_t {
     74    typedef unsigned int checksum_t;
    7475    // we seperate the tracking info from the rest
    7576    // A checksum will be calculated for this part of
     
    9091    } info;
    9192    bool isIgnored;
    92     char checksum;
     93    checksum_t checksum;
    9394    entry_t *prev;
    9495    entry_t *next;
     
    117118  // calculates a simple checksum for the info block
    118119  // the checksum is used to find memory corruptions
    119   inline char calcChecksum(entry_t::info_t *info){
     120  inline entry_t::checksum_t calcChecksum(entry_t::info_t *info){
    120121    char *buffer = (char*)info;
    121     char checksum =0;
     122    entry_t::checksum_t checksum =0;
    122123    for(size_t i=0;i<sizeof(entry_t::info_t);i++){
    123124      checksum+=buffer[i];
     
    154155      cout << "Chunk reserved at: " << pos->info.file << ":" << pos->info.line << endl;
    155156#endif
     157    }
     158  }
     159
     160  void dumpMemory(std::ostream &ost){
     161    ost << "Maximum allocated Memory: " << max << " bytes" << endl;
     162    ost << "Maximum allocated Memory: " << max << " bytes" << endl;
     163    ost << "Currently allocated Memory: " << state <<" bytes" << endl;
     164    ost << allocs << " allocated chunks total" << endl;
     165    bool corrupted=false;
     166    for(entry_t *pos=begin;pos;pos=pos->next){
     167      ost << "\nChunk of " << pos->info.nbytes << " bytes" << " still available" << endl;
     168#     ifdef __GNUC__
     169        ost << "Chunk reserved at: " << pos->info.function
     170             << " (" << pos->info.file << ":" << pos->info.line  << ")" << endl;
     171#     else
     172        ost << "Chunk reserved at: " << pos->info.file << ":" << pos->info.line << endl;
     173#     endif
     174        ost << "Chunk address: " << pos->info.location << endl;
     175        entry_t::checksum_t checksum = calcChecksum(&pos->info);
     176        ost << "Checksum of chunk: " << checksum << endl;
     177        ost << "Checksum at allocation time: " << pos->checksum << endl;
     178        if(checksum!=pos->checksum){
     179          ost << "!!!Chunk was corrupted!!!" << endl;
     180          corrupted=true;
     181        }
     182    }
     183    if(corrupted){
     184      ost << "\n!!!Memory corruption detected!!!" << endl;
    156185    }
    157186  }
  • src/Helpers/MemDebug.hpp

    r255971 rd223d5  
    6161   */
    6262  void getState();
     63  void dumpMemory(std::ostream&);
    6364
    6465  void _ignore(void*);
     
    100101
    101102#else
     103
     104#include <iosfwd>
     105
    102106// memory debugging was disabled
    103107
    104108namespace Memory {
    105   inline void getState(){}
     109  inline void getState(){};
     110
     111  inline void dumpMemory(std::ostream&){};
    106112
    107113  template <typename T>
  • src/Helpers/helpers.hpp

    r255971 rd223d5  
    194194};
    195195
     196/************ struct to contain simple enumerations ***************/
     197template <class C>
     198struct enumeration{
     199  enumeration() : max(0) {}
     200  enumeration(unsigned int i) : max(i) {}
     201  enumeration(const enumeration &src) :
     202    there(src.there),
     203    back(src.back),
     204    max(src.max)
     205  {}
     206  enumeration &operator=(const enumeration &src){
     207    /* no self-assignment check needed */
     208    there = src.there;
     209    back = src.back;
     210    max = src.max;
     211    return *this;
     212  }
     213  void add(const C &value){
     214    if(!there.count(value)){
     215      there[value]=max;
     216      back[max++]=value;
     217    }
     218  }
     219  unsigned int getMax() const{
     220    return max;
     221  }
     222
     223  map<C,unsigned int> there;
     224  map<unsigned int,C> back;
     225private:
     226  unsigned int max;
     227};
     228
     229/***** A counter to generate sequential numbers *******************/
     230struct counter{
     231  inline counter() : count(0){};
     232  inline counter(int i) : count(i){};
     233  inline unsigned int operator()(){
     234    return count++;
     235  }
     236private:
     237  unsigned int count;
     238};
     239
     240template <class C,class ForwardIterator>
     241enumeration<C> enumerate(ForwardIterator first,ForwardIterator last){
     242  enumeration<C> res;
     243  for_each(first,last,bind1st(mem_fun(&enumeration<C>::add),&res));
     244  return res;
     245}
     246
    196247#endif /*HELPERS_HPP_*/
  • src/LinearAlgebra/Makefile.am

    r255971 rd223d5  
    7171pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    7272
     73unity.cpp:
     74        echo "" >  unity.cpp; \
     75        list='$(LINALGSOURCE)'; for file in $$list; do \
     76          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     77        done;
     78       
     79MOSTLYCLEANFILES = unity.cpp
  • src/LinearAlgebra/linearsystemofequations.hpp

    r255971 rd223d5  
    66 */
    77
    8 using namespace std;
     8#ifndef LINEARSYSTEMSOFEQUATIONS_HPP
     9#define LINEARSYSTEMSOFEQUATIONS_HPP
    910
    1011/*********************************************** includes ***********************************/
     
    5556  bool IsSymmetric;
    5657};
     58
     59#endif /* LINEARSYSTEMSOFEQUATIONS_HPP */
  • src/Makefile.am

    r255971 rd223d5  
    44SUBDIRS = Actions Exceptions Helpers LinearAlgebra Parser UIElements
    55
    6                        
    76ATOMSOURCE = \
    87  atom.cpp \
     
    7372  Shapes/Shape.hpp \
    7473  Shapes/ShapeOps.hpp
     74
    7575 
    76 
    77 QTUIMOC_HEADER = UIElements/QT4/QTDialog.hpp \
    78         UIElements/QT4/QTMainWindow.hpp \
    79         UIElements/Menu/QT4/QTMenu.hpp \
    80         UIElements/Views/QT4/QTWorldView.hpp \
    81         UIElements/Views/QT4/GLMoleculeView.hpp \
    82         UIElements/Views/QT4/QTMoleculeView.hpp \
    83         UIElements/Views/QT4/QTStatusBar.hpp
    84  
    85 QTUIMOC_TARGETS = QTMainWindow.moc.cpp \
    86         QTMenu.moc.cpp\
    87         QTDialog.moc.cpp \
    88         QTWorldView.moc.cpp \
    89         GLMoleculeView.moc.cpp \
    90         QTMoleculeView.moc.cpp \
    91         QTStatusBar.moc.cpp
    92 
    9376DESCRIPTORSOURCE = Descriptors/AtomDescriptor.cpp \
    9477  Descriptors/AtomIdDescriptor.cpp \
     
    11396  Descriptors/MoleculePtrDescriptor.hpp \
    11497  Descriptors/MoleculeSelectionDescriptor.cpp
     98
     99
     100QTUIMOC_HEADER = UIElements/QT4/QTDialog.hpp \
     101        UIElements/QT4/QTMainWindow.hpp \
     102        UIElements/Menu/QT4/QTMenu.hpp \
     103        UIElements/Views/QT4/QTWorldView.hpp \
     104        UIElements/Views/QT4/GLMoleculeView.hpp \
     105        UIElements/Views/QT4/QTMoleculeView.hpp \
     106        UIElements/Views/QT4/QTStatusBar.hpp
    115107                                 
    116 QTUISOURCE = ${QTUIMOC_TARGETS} \
     108QTUISOURCE = allmocs.moc.cpp \
    117109        UIElements/QT4/QTMainWindow.cpp \
    118110        UIElements/QT4/QTDialog.cpp \
     
    136128  ${SHAPESOURCE} \
    137129  ${DESCRIPTORSOURCE} \
    138   ${HELPERSOURCE} \
    139130  bond.cpp \
    140131  bondgraph.cpp \
     
    229220## from each source file.  Note that it is not necessary to list header files
    230221## which are already listed elsewhere in a _HEADERS variable assignment.
    231 libMolecuilder_@MOLECUILDER_API_VERSION@_la_SOURCES = ${MOLECUILDERSOURCE}  $(srcdir)/version.c
     222libMolecuilder_@MOLECUILDER_API_VERSION@_la_SOURCES = ${MOLECUILDERSOURCE} $(srcdir)/version.c
    232223
    233224## Instruct libtool to include ABI version information in the generated shared
     
    264255noinst_LIBRARIES = libmenu.a
    265256bin_PROGRAMS = molecuilder molecuildergui joiner analyzer
     257EXTRA_PROGRAMS = unity
    266258
    267259molecuilderdir = ${bindir}
     
    292284molecuildergui_CXXFLAGS = ${QT_CXXFLAGS} ${GLU_CXXFLAGS} -DUSE_GUI_QT
    293285molecuildergui_LDFLAGS = $(BOOST_LIB) ${QT_LDFLAGS} ${GLU_LDFLAGS}
     286
     287unity_SOURCES = unity.cpp
     288unity_LDADD = $(BOOST_LIB) ${BOOST_THREAD_LIB} ${BOOST_PROGRAM_OPTIONS_LIB}
     289
    294290molecuildergui_LDADD = \
    295291        UIElements/libMolecuilderUI-@MOLECUILDER_API_VERSION@.la \
     
    329325# Therfore `%'-rules do not seem to work
    330326#Quick fix to get it done otherwise
    331 ${QTUIMOC_TARGETS}: ${QTUIMOC_HEADER}
     327allmocs.moc.cpp: ${QTUIMOC_HEADER}
     328        echo "" > allmocs.moc.cpp;\
    332329        list='$(QTUIMOC_HEADER)'; for header in $$list; do \
    333330        echo "Making mocfile for $$header"; \
     
    335332        $(MOC) $(srcdir)/$$header -o $$target \
    336333        || eval $$failcom; \
     334        echo "#include \"$$target\"" >> allmocs.moc.cpp; \
    337335        done;
    338336
    339 MOSTLYCLEANFILES = ${QTUIMOC_TARGETS}
    340        
    341337#EXTRA_DIST = ${molecuilder_DATA}
    342338
     
    357353
    358354
     355unity.cpp: ${MOLECUILDERSOURCE} ${MOLECUILDERHEADER}
     356        echo "" >  unity.cpp; \
     357        list='$(MOLECUILDERSOURCE)'; for file in $$list; do \
     358          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     359        done; \
     360        subdirs='$(SUBDIRS)';for directory in $$subdirs; do\
     361                olddir=$$PWD;\
     362                cd $$directory && make unity.cpp;\
     363                cd $$olddir;\
     364                echo "#include \"$$directory/unity.cpp\"" >> unity.cpp;\
     365        done;\
     366        echo "#include \"$(srcdir)/builder.cpp\"" >> unity.cpp;
     367        echo "#include \"$(srcdir)/version.c\"" >> unity.cpp;
     368
     369MOSTLYCLEANFILES = allmocs.moc.cpp unity.cpp
     370       
  • src/Parser/Makefile.am

    r255971 rd223d5  
    6666pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    6767
     68unity.cpp:
     69        echo "" >  unity.cpp; \
     70        list='$(PARSERSOURCE)'; for file in $$list; do \
     71          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     72        done;
     73       
     74MOSTLYCLEANFILES = unity.cpp
  • src/Parser/TremoloParser.cpp

    r255971 rd223d5  
    2121
    2222using namespace std;
    23 using namespace boost;
    2423
    2524/**
  • src/UIElements/Makefile.am

    r255971 rd223d5  
    118118pkgconfig_DATA = $(top_builddir)/molecuilder-$(MOLECUILDER_API_VERSION).pc
    119119
     120unity.cpp:
     121        echo "" >  unity.cpp; \
     122        list='$(UISOURCE)'; for file in $$list; do \
     123          echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
     124        done;
     125       
     126MOSTLYCLEANFILES = unity.cpp
  • src/UIElements/QT4/QTDialog.cpp

    r255971 rd223d5  
    77
    88#include "UIElements/QT4/QTDialog.hpp"
     9
     10#include <boost/lexical_cast.hpp>
    911
    1012#include <string>
  • src/UIElements/TextUI/TextDialog.cpp

    r255971 rd223d5  
    2828#include "LinearAlgebra/Matrix.hpp"
    2929#include "Box.hpp"
     30
     31#include <boost/lexical_cast.hpp>
    3032
    3133using namespace std;
     
    523525    }
    524526  }
     527  return true;
    525528}
    526529
  • src/UIElements/TextUI/TextWindow.cpp

    r255971 rd223d5  
    2525#include "Views/StreamStringView.hpp"
    2626#include "Views/MethodStringView.hpp"
    27 #include "Helpers/MemDebug.hpp"
    2827
    2928#include "defs.hpp"
  • src/World.cpp

    r255971 rd223d5  
    3232
    3333using namespace std;
     34
     35const unsigned int MAX_POOL_FRAGMENTATION=20;
     36const unsigned int MAX_FRAGMENTATION_SKIPS=100;
    3437
    3538/******************************* getter and setter ************************/
     
    718721  delete cell_size;
    719722  delete molecules_deprecated;
    720   delete periode;
    721   delete configuration;
    722   delete Thermostats;
    723723  MoleculeSet::iterator molIter;
    724724  for(molIter=molecules.begin();molIter!=molecules.end();++molIter){
     
    731731  }
    732732  atoms.clear();
     733  delete periode;
     734  delete configuration;
     735  delete Thermostats;
    733736}
    734737
  • src/atom.cpp

    r255971 rd223d5  
    1919
    2020#include <iomanip>
     21#include <iostream>
    2122
    2223/************************************* Functions for class atom *************************************/
     
    109110};
    110111
     112bool atom::isFather(const atom *ptr){
     113  return ptr==father;
     114}
     115
    111116/** Checks whether atom is within the given box.
    112117 * \param offset offset to box origin
     
    161166  * \return true - \a *out present, false - \a *out is NULL
    162167 */
    163 bool atom::OutputArrayIndexed(ostream * const out, const int *ElementNo, int *AtomNo, const char *comment) const
     168bool atom::OutputArrayIndexed(ostream * const out,const enumeration<const element*> &elementLookup, int *AtomNo, const char *comment) const
    164169{
    165170  AtomNo[type->Z]++;  // increment number
    166171  if (out != NULL) {
    167     *out << "Ion_Type" << ElementNo[type->Z] << "_" << AtomNo[type->Z] << "\t"  << fixed << setprecision(9) << showpoint;
     172    cout << "Looking for atom with element " << *type << endl;
     173    ASSERT(elementLookup.there.find(type)!=elementLookup.there.end(),"Type of this atom was not in the formula upon enumeration");
     174    *out << "Ion_Type" << elementLookup.there.find(type)->second << "_" << AtomNo[type->Z] << "\t"  << fixed << setprecision(9) << showpoint;
    168175    *out << x[0] << "\t" << x[1] << "\t" << x[2];
    169176    *out << "\t" << FixedIon;
  • src/atom.hpp

    r255971 rd223d5  
    5252
    5353  bool OutputIndexed(ofstream * const out, const int ElementNo, const int AtomNo, const char *comment = NULL) const;
    54   bool OutputArrayIndexed(ostream * const out, const int *ElementNo, int *AtomNo, const char *comment = NULL) const;
     54  bool OutputArrayIndexed(ostream * const out,const enumeration<const element*>&, int *AtomNo, const char *comment = NULL) const;
    5555  bool OutputXYZLine(ofstream *out) const;
    5656  bool OutputTrajectory(ofstream * const out, const int *ElementNo, int *AtomNo, const int step) const;
     
    6161
    6262  void EqualsFather ( const atom *ptr, const atom **res ) const;
     63  bool isFather(const atom *ptr);
    6364  void CorrectFather();
    6465  atom *GetTrueFather();
  • src/builder.cpp

    r255971 rd223d5  
    110110}
    111111
     112void dumpMemory(){
     113  ofstream ost("molecuilder.memdump");
     114  Memory::dumpMemory(ost);
     115}
     116
    112117int main(int argc, char **argv)
    113118{
    114119  // while we are non interactive, we want to abort from asserts
    115   //ASSERT_DO(Assert::Abort);
     120  ASSERT_DO(Assert::Abort);
     121  ASSERT_HOOK(dumpMemory);
    116122  string line;
    117123  char **Arguments = NULL;
     
    127133  // need to init the history before any action is created
    128134  ActionHistory::init();
    129 
    130   // In the interactive mode, we can leave the user the choice in case of error
    131   ASSERT_DO(Assert::Ask);
    132135
    133136  // from this moment on, we need to be sure to deeinitialize in the correct order
     
    155158      UIFactory::makeUserInterface("CommandLine");
    156159    } else {
     160      // In the interactive mode, we can leave the user the choice in case of error
     161      ASSERT_DO(Assert::Ask);
    157162      #ifdef USE_GUI_QT
    158163        DoLog(0) && (Log() << Verbose(0) << "Setting UI to QT4." << endl);
  • src/defs.hpp

    r255971 rd223d5  
    8484#define MOLECUILDER_NAME "Molecuilder"
    8585
    86 const unsigned int MAX_POOL_FRAGMENTATION=20;
    87 const unsigned int MAX_FRAGMENTATION_SKIPS=100;
     86const extern unsigned int MAX_POOL_FRAGMENTATION;
     87const extern unsigned int MAX_FRAGMENTATION_SKIPS;
    8888
    8989#endif /*DEFS_HPP_*/
  • src/element.cpp

    r255971 rd223d5  
    2626        next(NULL),
    2727        sort(NULL),
    28         No(-1),
    2928        Valence(0),
    3029        NoValenceOrbitals(0)
     
    7069  return string(symbol);
    7170}
     71
     72std::string element::getName() const{
     73  return string(name);
     74}
     75
     76std::ostream &operator<<(std::ostream &ost,const element &elem){
     77  ost << elem.getName() << "(" << elem.getNumber() << ")";
     78  return ost;
     79}
  • src/element.hpp

    r255971 rd223d5  
    4141    element *next;  //!< next element in list
    4242    int *sort;      //!< sorc criteria
    43     int No;         //!< number of element set on periodentafel::Output()
    4443    double Valence;   //!< number of valence electrons for this element
    4544    int NoValenceOrbitals;  //!< number of valence orbitals, used for determining bond degree in molecule::CreateConnectmatrix()
     
    5352  atomicNumber_t getNumber() const;
    5453  std::string getSymbol() const;
     54  std::string getName() const;
    5555
    5656  //> print element entries to screen
     
    6161};
    6262
     63std::ostream &operator<<(std::ostream&,const element&);
    6364
    6465#endif /* ELEMENT_HPP_ */
  • src/molecule.cpp

    r255971 rd223d5  
    151151molecule::const_iterator molecule::erase( const_iterator loc )
    152152{
     153  OBSERVE;
    153154  molecule::const_iterator iter = loc;
    154155  iter--;
     
    156157  atomIds.erase( atom->getId() );
    157158  atoms.remove( atom );
     159  formula-=atom->type;
    158160  atom->removeFromMolecule();
    159161  return iter;
     
    162164molecule::const_iterator molecule::erase( atom * key )
    163165{
     166  OBSERVE;
    164167  molecule::const_iterator iter = find(key);
    165168  if (iter != end()){
    166169    atomIds.erase( key->getId() );
    167170    atoms.remove( key );
     171    formula-=key->type;
    168172    key->removeFromMolecule();
    169173  }
     
    183187pair<molecule::iterator,bool> molecule::insert ( atom * const key )
    184188{
     189  OBSERVE;
    185190  pair<atomIdSet::iterator,bool> res = atomIds.insert(key->getId());
    186191  if (res.second) { // push atom if went well
    187192    atoms.push_back(key);
     193    formula+=key->type;
    188194    return pair<iterator,bool>(molecule::iterator(--end()),res.second);
    189195  } else {
     
    233239  if (pointer != NULL) {
    234240    atom *walker = pointer->clone();
     241    formula += walker->type;
    235242    walker->setName(pointer->getName());
    236243    walker->nr = last_atom++;  // increase number within molecule
     
    619626{
    620627  molecule *copy = World::getInstance().createMolecule();
    621   atom *LeftAtom = NULL, *RightAtom = NULL;
    622628
    623629  // copy all atoms
    624   ActOnCopyWithEachAtom ( &molecule::AddCopyAtom, copy );
     630  for_each(atoms.begin(),atoms.end(),bind1st(mem_fun(&molecule::AddCopyAtom),copy));
    625631
    626632  // copy all bonds
    627   bond *Binder = NULL;
    628   bond *NewBond = NULL;
    629633  for(molecule::iterator AtomRunner = begin(); AtomRunner != end(); ++AtomRunner)
    630634    for(BondList::iterator BondRunner = (*AtomRunner)->ListOfBonds.begin(); !(*AtomRunner)->ListOfBonds.empty(); BondRunner = (*AtomRunner)->ListOfBonds.begin())
    631635      if ((*BondRunner)->leftatom == *AtomRunner) {
    632         Binder = (*BondRunner);
     636        bond *Binder = (*BondRunner);
    633637
    634638        // get the pendant atoms of current bond in the copy molecule
    635         copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->leftatom, (const atom **)&LeftAtom );
    636         copy->ActOnAllAtoms( &atom::EqualsFather, (const atom *)Binder->rightatom, (const atom **)&RightAtom );
    637 
    638         NewBond = copy->AddBond(LeftAtom, RightAtom, Binder->BondDegree);
     639        atomSet::iterator leftiter=find_if(atoms.begin(),atoms.end(),bind2nd(mem_fun(&atom::isFather),Binder->leftatom));
     640        atomSet::iterator rightiter=find_if(atoms.begin(),atoms.end(),bind2nd(mem_fun(&atom::isFather),Binder->rightatom));
     641        ASSERT(leftiter!=atoms.end(),"No original left atom for bondcopy found");
     642        ASSERT(leftiter!=atoms.end(),"No original right atom for bondcopy found");
     643        atom *LeftAtom = *leftiter;
     644        atom *RightAtom = *rightiter;
     645
     646        bond *NewBond = copy->AddBond(LeftAtom, RightAtom, Binder->BondDegree);
    639647        NewBond->Cyclic = Binder->Cyclic;
    640648        if (Binder->Cyclic)
     
    643651      }
    644652  // correct fathers
    645   ActOnAllAtoms( &atom::CorrectFather );
     653  for_each(atoms.begin(),atoms.end(),mem_fun(&atom::CorrectFather));
    646654
    647655  // copy values
     
    852860 * \param *out output stream
    853861 */
    854 bool molecule::Output(ofstream * const output)
    855 {
    856   int ElementNo[MAX_ELEMENTS], AtomNo[MAX_ELEMENTS];
    857 
    858   for (int i=0;i<MAX_ELEMENTS;++i) {
    859     AtomNo[i] = 0;
    860     ElementNo[i] = 0;
    861   }
     862bool molecule::Output(ostream * const output)
     863{
    862864  if (output == NULL) {
    863865    return false;
    864866  } else {
     867    int AtomNo[MAX_ELEMENTS];
     868    memset(AtomNo,0,(MAX_ELEMENTS-1)*sizeof(*AtomNo));
     869    enumeration<const element*> elementLookup = formula.enumerateElements();
     870    for(map<const element*,unsigned int>::iterator iter=elementLookup.there.begin();
     871        iter!=elementLookup.there.end();++iter){
     872      cout << "Enumerated element " << *iter->first << " with number " << iter->second << endl;
     873    }
    865874    *output << "#Ion_TypeNr._Nr.R[0]    R[1]    R[2]    MoveType (0 MoveIon, 1 FixedIon)" << endl;
    866     SetIndexedArrayForEachAtomTo ( ElementNo, &element::Z, &AbsoluteValue, 1);
    867     int current=1;
    868     for (int i=0;i<MAX_ELEMENTS;++i) {
    869       if (ElementNo[i] == 1)
    870         ElementNo[i] = current++;
    871     }
    872     ActOnAllAtoms( &atom::OutputArrayIndexed, (ostream * const) output, (const int *)ElementNo, (int *)AtomNo, (const char *) NULL );
     875    for_each(atoms.begin(),atoms.end(),boost::bind(&atom::OutputArrayIndexed,_1,output,elementLookup,AtomNo,(const char*)0));
    873876    return true;
    874877  }
     
    913916{
    914917  DoLog(2) && (Log() << Verbose(2) << endl << "From Contents of ListOfBonds, all non-hydrogen atoms:" << endl);
    915   ActOnAllAtoms (&atom::OutputBondOfAtom );
     918  for_each(atoms.begin(),atoms.end(),mem_fun(&atom::OutputBondOfAtom));
    916919  DoLog(0) && (Log() << Verbose(0) << endl);
    917920};
     
    936939    for (int step=0;step<MDSteps;step++) {
    937940      *output << getAtomCount() << "\n\tCreated by molecuilder, step " << step << ", on " << ctime(&now);
    938       ActOnAllAtoms( &atom::OutputTrajectoryXYZ, output, step );
     941      for_each(atoms.begin(),atoms.end(),boost::bind(&atom::OutputTrajectoryXYZ,_1,output,step));
    939942    }
    940943    return true;
     
    953956    now = time((time_t *)NULL);   // Get the system time and put it into 'now' as 'calender time'
    954957    *output << getAtomCount() << "\n\tCreated by molecuilder on " << ctime(&now);
    955     ActOnAllAtoms( &atom::OutputXYZLine, output );
     958    for_each(atoms.begin(),atoms.end(),bind2nd(mem_fun(&atom::OutputXYZLine),output));
    956959    return true;
    957960  } else
  • src/molecule.hpp

    r255971 rd223d5  
    341341
    342342  // Output routines.
    343   bool Output(ofstream * const output);
     343  bool Output(std::ostream * const output);
    344344  bool OutputTrajectories(ofstream * const output);
    345345  void OutputListOfBonds() const;
  • src/unittests/ActionSequenceTest.cpp

    r255971 rd223d5  
    243243
    244244  CPPUNIT_ASSERT_EQUAL(true,wasCalled1->wasCalled());
    245   CPPUNIT_ASSERT_EQUAL(true,wasCalled1->wasCalled());
     245  CPPUNIT_ASSERT_EQUAL(true,wasCalled2->wasCalled());
    246246
    247247  ActionHistory::getInstance().undoLast();
    248248
    249249  CPPUNIT_ASSERT_EQUAL(false,wasCalled1->wasCalled());
    250   CPPUNIT_ASSERT_EQUAL(false,wasCalled1->wasCalled());
    251 
    252 }
    253 
    254 
     250  CPPUNIT_ASSERT_EQUAL(false,wasCalled2->wasCalled());
     251
     252}
     253
     254
  • src/unittests/FormulaUnittest.cpp

    r255971 rd223d5  
    185185  }
    186186  {
     187    Formula formula("CH2(COOH)2");
     188    CPPUNIT_ASSERT_EQUAL(formula["H"],(unsigned int)4);
     189    CPPUNIT_ASSERT_EQUAL(formula["O"],(unsigned int)4);
     190    CPPUNIT_ASSERT_EQUAL(formula["C"],(unsigned int)3);
     191    CPPUNIT_ASSERT_EQUAL(formula["Na"],(unsigned int)0);
     192    CPPUNIT_ASSERT_EQUAL(formula["He"],(unsigned int)0);
     193  }
     194  {
     195    Formula formula("K4[Fe(CN)6]");
     196    CPPUNIT_ASSERT_EQUAL(formula["H"],(unsigned int)0);
     197    CPPUNIT_ASSERT_EQUAL(formula["O"],(unsigned int)0);
     198    CPPUNIT_ASSERT_EQUAL(formula["C"],(unsigned int)6);
     199    CPPUNIT_ASSERT_EQUAL(formula["Na"],(unsigned int)0);
     200    CPPUNIT_ASSERT_EQUAL(formula["He"],(unsigned int)0);
     201    CPPUNIT_ASSERT_EQUAL(formula["K"],(unsigned int)4);
     202    CPPUNIT_ASSERT_EQUAL(formula["Fe"],(unsigned int)1);
     203    CPPUNIT_ASSERT_EQUAL(formula["N"],(unsigned int)6);
     204  }
     205  {
     206    Formula formula("[CrCl3(H2O)3]");
     207    CPPUNIT_ASSERT_EQUAL(formula["H"],(unsigned int)6);
     208    CPPUNIT_ASSERT_EQUAL(formula["O"],(unsigned int)3);
     209    CPPUNIT_ASSERT_EQUAL(formula["C"],(unsigned int)0);
     210    CPPUNIT_ASSERT_EQUAL(formula["Na"],(unsigned int)0);
     211    CPPUNIT_ASSERT_EQUAL(formula["He"],(unsigned int)0);
     212    CPPUNIT_ASSERT_EQUAL(formula["Cr"],(unsigned int)1);
     213    CPPUNIT_ASSERT_EQUAL(formula["Cl"],(unsigned int)3);
     214  }
     215  {
     216    Formula formula("Mg3[Fe(CN)6]2");
     217    CPPUNIT_ASSERT_EQUAL(formula["H"],(unsigned int)0);
     218    CPPUNIT_ASSERT_EQUAL(formula["O"],(unsigned int)0);
     219    CPPUNIT_ASSERT_EQUAL(formula["C"],(unsigned int)12);
     220    CPPUNIT_ASSERT_EQUAL(formula["Na"],(unsigned int)0);
     221    CPPUNIT_ASSERT_EQUAL(formula["He"],(unsigned int)0);
     222    CPPUNIT_ASSERT_EQUAL(formula["Mg"],(unsigned int)3);
     223    CPPUNIT_ASSERT_EQUAL(formula["Fe"],(unsigned int)2);
     224    CPPUNIT_ASSERT_EQUAL(formula["N"],(unsigned int)12);
     225  }
     226  {
     227    Formula formula("Na[Fe((HO2CCH2)2NCH2CH2N(CH2CO2H)2)]");
     228    CPPUNIT_ASSERT_EQUAL(formula["H"],(unsigned int)16);
     229    CPPUNIT_ASSERT_EQUAL(formula["O"],(unsigned int)8);
     230    CPPUNIT_ASSERT_EQUAL(formula["C"],(unsigned int)10);
     231    CPPUNIT_ASSERT_EQUAL(formula["Na"],(unsigned int)1);
     232    CPPUNIT_ASSERT_EQUAL(formula["He"],(unsigned int)0);
     233    CPPUNIT_ASSERT_EQUAL(formula["Mg"],(unsigned int)0);
     234    CPPUNIT_ASSERT_EQUAL(formula["Fe"],(unsigned int)1);
     235    CPPUNIT_ASSERT_EQUAL(formula["N"],(unsigned int)2);
     236  }
     237  {
    187238    CPPUNIT_ASSERT_THROW(Formula formula("74107"),ParseError);
    188239    CPPUNIT_ASSERT_THROW(Formula formula("  "),ParseError);
     
    192243    CPPUNIT_ASSERT_THROW(Formula formula("1NaCl"),ParseError);
    193244    CPPUNIT_ASSERT_THROW(Formula formula("Mag"),ParseError);
     245    CPPUNIT_ASSERT_THROW(Formula formula("AgCl)"),ParseError);
     246    CPPUNIT_ASSERT_THROW(Formula formula("(Na"),ParseError);
     247    CPPUNIT_ASSERT_THROW(Formula formula("(Mag)"),ParseError);
     248    CPPUNIT_ASSERT_THROW(Formula formula("MgCl2)"),ParseError);
     249    CPPUNIT_ASSERT_THROW(Formula formula("((MgCl2)"),ParseError);
     250    CPPUNIT_ASSERT_THROW(Formula formula("(MgCl2))"),ParseError);
     251    CPPUNIT_ASSERT_THROW(Formula formula("(MgCl2]"),ParseError);
     252    CPPUNIT_ASSERT_THROW(Formula formula("[MgCl2)"),ParseError);
     253    CPPUNIT_ASSERT_THROW(Formula formula("N(aCl"),ParseError);
     254    CPPUNIT_ASSERT_THROW(Formula formula("Na()Cl"),ParseError);
    194255  }
    195256
  • src/unittests/Makefile.am

    r255971 rd223d5  
    6464UILIBS = ../UIElements/libMolecuilderUI-@MOLECUILDER_API_VERSION@.la 
    6565
    66 
    6766TESTSOURCES = \
    6867  ActOnAllUnitTest.cpp \
  • src/unittests/ShapeUnittest.cpp

    r255971 rd223d5  
    1616#endif /*HAVE_TESTRUNNER*/
    1717
     18#include "LinearAlgebra/Vector.hpp"
    1819#include "Shapes/Shape.hpp"
    19 #include "LinearAlgebra/Vector.hpp"
    2020
    2121// Registers the fixture into the 'registry'
  • test_all.sh

    r255971 rd223d5  
    111111  echo "Making";
    112112  if [ $noprocs -gt 1 ]; then
    113     make -j$noprocs all install >>$logfile 2>&1;
    114   else
    115     make all install >>$logfile 2>&1;
     113    make -j$noprocs all >>$logfile 2>&1;
     114  else
     115    make all >>$logfile 2>&1;
    116116  fi
    117117}
  • tests/Tesselations/Makefile.am

    r255971 rd223d5  
    1 TESTS = 1_2-dimethoxyethane.test \
    2 1_2-dimethylbenzene.test \
    3 2-methylcyclohexanone.test \
    4 benzene.test \
    5 cholesterol.test \
    6 cycloheptane.test \
    7 dimethyl_bromomalonate.test \
    8 glucose.test \
    9 heptan.test \
    10 isoleucine.test \
    11 neohexane.test \
    12 N_N-dimethylacetamide.test \
    13 proline.test \
    14 putrescine.test \
    15 tartaric_acid.test
     1TESTS = \
     2        1_2-dimethoxyethane.test \
     3        1_2-dimethylbenzene.test \
     4        2-methylcyclohexanone.test \
     5        benzene.test \
     6        cholesterol.test \
     7        cycloheptane.test \
     8        dimethyl_bromomalonate.test \
     9        glucose.test \
     10        isoleucine.test \
     11        neohexane.test \
     12        N_N-dimethylacetamide.test \
     13        proline.test \
     14        putrescine.test \
     15        tartaric_acid.test
     16
     17#       heptan.test
Note: See TracChangeset for help on using the changeset viewer.