// Path: src/com/metamolecular/mx/io/mdl/SDFileReader.java
// public class SDFileReader
// {
//   private static String RECORD_END = "$$$$";
//   private static String LINEFEED = "\n";
//   private BufferedReader reader;
//   private Reader file;
//   private String record;
//   private Pattern keyPattern;
//   private Pattern molfilePattern;
//   private Map<String, Pattern> keyPatterns;
// 
//   public SDFileReader(String filename) throws IOException
//   {
//     record = null;
//     file = new FileReader(filename);
//     reader = new BufferedReader(file);
//     keyPattern = Pattern.compile("^> *?<(.*?)>", Pattern.MULTILINE);
//     molfilePattern = Pattern.compile("^(.*M  END)", Pattern.DOTALL);
//     keyPatterns = new HashMap<String, Pattern>();
//   }
// 
//   public void close()
//   {
//     try
//     {
//       file.close();
//     }
//     catch (IOException e)
//     {
//       throw new RuntimeException("Error closing file.", e);
//     }
//   }
// 
//   public boolean hasNextRecord()
//   {
//     try
//     {
//       return reader.ready();
//     }
//     catch (IOException ignore)
//     {
//     }
// 
//     return false;
//   }
// 
//   public void nextRecord()
//   {
//     StringBuffer buff = new StringBuffer();
// 
//     try
//     {
//       String line = reader.readLine();
// 
//       while (!RECORD_END.equals(line))
//       {
//         buff.append(line + LINEFEED);
// 
//         line = reader.readLine();
//       }
//     }
//     catch (IOException e)
//     {
//       throw new RuntimeException("An unexpected IO error occurred while reading file.", e);
//     }
// 
//     record = buff.toString();
//   }
// 
//   public String getData(String key)
//   {
//     assertRecordLoaded();
// 
//     Pattern pattern = keyPatterns.get(key);
// 
//     if (pattern == null)
//     {
//       pattern = Pattern.compile(".*^> *?<" + key + ">$(.*?)$^$.*", Pattern.MULTILINE | Pattern.DOTALL);
// 
//       keyPatterns.put(key, pattern);
//     }
// 
//     Matcher matcher = pattern.matcher(record);
// 
//     return matcher.matches() ? matcher.group(1).trim() : "";
//   }
// 
//   public Molecule getMolecule()
//   {
//     assertRecordLoaded();
// 
//     Matcher matcher = molfilePattern.matcher(record);
// 
//     matcher.find();
// 
//     String molfile = matcher.group(1);
// 
//     return MoleculeKit.readMolfile(molfile);
//   }
// 
//   public Molecule getMolecule(boolean virtualizeHydrogens)
//   {
//     assertRecordLoaded();
// 
//     Matcher matcher = molfilePattern.matcher(record);
// 
//     matcher.find();
// 
//     String molfile = matcher.group(1);
// 
//     return MoleculeKit.readMolfile(molfile, virtualizeHydrogens);
//   }
// 
//   public List<String> getKeys()
//   {
//     List<String> result = new ArrayList<String>();
//     Matcher m = keyPattern.matcher(record);
// 
//     while (m.find())
//     {
//       result.add(m.group(1));
//     }
// 
//     return result;
//   }
// 
//   private void assertRecordLoaded()
//   {
//     if (record == null)
//     {
//       throw new IllegalStateException("No record has been loaded. Make sure you've called nextRecord() first.");
//     }
//   }
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }


import java.util.List;
import junit.framework.TestCase;
import com.metamolecular.mx.io.mdl.SDFileReader;
import com.metamolecular.mx.model.Molecule;
import java.io.IOException;
import java.util.Arrays;
      reader.getMolecule();

      fail();
    }
    catch (IllegalStateException e)
    {
      assertTrue(true);
    }
  }

  public void testItShouldThrowIOExceptionWhenCreatedFromANonexistentFile()
  {
    try
    {
      new SDFileReader("bar.sdf");

      fail();
    }
    catch (IOException ignore)
    {
      assertTrue(true);
    }
  }

  public void testItShouldLoadAMoleculeForEveryRecord()
  {
    while (reader.hasNextRecord())
    {
      reader.nextRecord();

// Path: src/com/metamolecular/mx/io/mdl/SDFileReader.java
// public class SDFileReader
// {
//   private static String RECORD_END = "$$$$";
//   private static String LINEFEED = "\n";
//   private BufferedReader reader;
//   private Reader file;
//   private String record;
//   private Pattern keyPattern;
//   private Pattern molfilePattern;
//   private Map<String, Pattern> keyPatterns;
// 
//   public SDFileReader(String filename) throws IOException
//   {
//     record = null;
//     file = new FileReader(filename);
//     reader = new BufferedReader(file);
//     keyPattern = Pattern.compile("^> *?<(.*?)>", Pattern.MULTILINE);
//     molfilePattern = Pattern.compile("^(.*M  END)", Pattern.DOTALL);
//     keyPatterns = new HashMap<String, Pattern>();
//   }
// 
//   public void close()
//   {
//     try
//     {
//       file.close();
//     }
//     catch (IOException e)
//     {
//       throw new RuntimeException("Error closing file.", e);
//     }
//   }
// 
//   public boolean hasNextRecord()
//   {
//     try
//     {
//       return reader.ready();
//     }
//     catch (IOException ignore)
//     {
//     }
// 
//     return false;
//   }
// 
//   public void nextRecord()
//   {
//     StringBuffer buff = new StringBuffer();
// 
//     try
//     {
//       String line = reader.readLine();
// 
//       while (!RECORD_END.equals(line))
//       {
//         buff.append(line + LINEFEED);
// 
//         line = reader.readLine();
//       }
//     }
//     catch (IOException e)
//     {
//       throw new RuntimeException("An unexpected IO error occurred while reading file.", e);
//     }
// 
//     record = buff.toString();
//   }
// 
//   public String getData(String key)
//   {
//     assertRecordLoaded();
// 
//     Pattern pattern = keyPatterns.get(key);
// 
//     if (pattern == null)
//     {
//       pattern = Pattern.compile(".*^> *?<" + key + ">$(.*?)$^$.*", Pattern.MULTILINE | Pattern.DOTALL);
// 
//       keyPatterns.put(key, pattern);
//     }
// 
//     Matcher matcher = pattern.matcher(record);
// 
//     return matcher.matches() ? matcher.group(1).trim() : "";
//   }
// 
//   public Molecule getMolecule()
//   {
//     assertRecordLoaded();
// 
//     Matcher matcher = molfilePattern.matcher(record);
// 
//     matcher.find();
// 
//     String molfile = matcher.group(1);
// 
//     return MoleculeKit.readMolfile(molfile);
//   }
// 
//   public Molecule getMolecule(boolean virtualizeHydrogens)
//   {
//     assertRecordLoaded();
// 
//     Matcher matcher = molfilePattern.matcher(record);
// 
//     matcher.find();
// 
//     String molfile = matcher.group(1);
// 
//     return MoleculeKit.readMolfile(molfile, virtualizeHydrogens);
//   }
// 
//   public List<String> getKeys()
//   {
//     List<String> result = new ArrayList<String>();
//     Matcher m = keyPattern.matcher(record);
// 
//     while (m.find())
//     {
//       result.add(m.group(1));
//     }
// 
//     return result;
//   }
// 
//   private void assertRecordLoaded()
//   {
//     if (record == null)
//     {
//       throw new IllegalStateException("No record has been loaded. Make sure you've called nextRecord() first.");
//     }
//   }
// }
// 
// Path: src/com/metamolecular/mx/model/Molecule.java
// public interface Molecule
// {
//   public int countAtoms();
//   
//   public int countBonds();
// 
//   public int countSuperatoms();
// 
//   public Atom getAtom(int index);
//   
//   public Bond getBond(int index);
//   
//   public Bond getBond(Atom source, Atom target);
// 
//   public Superatom getSuperatom(int index);
// 
//   public Superatom addSuperatom();
// 
//   public Atom addAtom(String symbol, double x, double y, double z);
//   
//   public Atom addAtom(String symbol);
//   
//   public void removeAtom(Atom atom);
//   
//   public Bond connect(Atom source, Atom target, int type, int stereo);
//   
//   public Bond connect(Atom source, Atom target, int type);
//                                      
//   public void removeBond(Bond bond);
//   
//   public void disconnect(Atom source, Atom target);
// 
//   public void removeSuperatom(Superatom substructure);
//   
//   public void clear();
//   
//   public void beginModify();
//   
//   public void endModify();
// 
//   public void addChangeListener(ChangeListener listener);
// 
//   public void removeChangeListener(ChangeListener listener);
//   
//   public Molecule copy();
//   
//   public void copy(Molecule molecule);
// }


// Path: src/com/metamolecular/mx/test/SDFileReaderTest.java
import java.util.List;
import junit.framework.TestCase;
import com.metamolecular.mx.io.mdl.SDFileReader;
import com.metamolecular.mx.model.Molecule;
import java.io.IOException;
import java.util.Arrays;

      reader.getMolecule();

      fail();
    }
    catch (IllegalStateException e)
    {
      assertTrue(true);
    }
  }

  public void testItShouldThrowIOExceptionWhenCreatedFromANonexistentFile()
  {
    try
    {
      new SDFileReader("bar.sdf");

      fail();
    }
    catch (IOException ignore)
    {
      assertTrue(true);
    }
  }

  public void testItShouldLoadAMoleculeForEveryRecord()
  {
    while (reader.hasNextRecord())
    {
      reader.nextRecord();

      Molecule molecule = reader.getMolecule();