#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 1118 João Pedro Rodrigues # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Unit Tests for `pdb_shiftres`. """ import os import sys import unittest from config import data_dir from utils import OutputCapture class TestTool(unittest.TestCase): """ Generic class for testing tools. """ def setUp(self): # Dynamically import the module name = 'pdbtools.pdb_shiftres' self.module = __import__(name, fromlist=['']) def exec_module(self): """ Execs module. """ with OutputCapture() as output: try: self.module.main() except SystemExit as e: self.retcode = e.code self.stdout = output.stdout self.stderr = output.stderr return def test_default(self): """$ pdb_shiftres data/dummy.pdb""" # Simulate input # pdb_shiftres dummy.pdb sys.argv = ['', os.path.join(data_dir, 'dummy.pdb')] # Execute the script self.exec_module() # Validate results self.assertEqual(self.retcode, 0) # ensure the program exited OK. self.assertEqual(len(self.stdout), 204) # no lines deleted self.assertEqual(len(self.stderr), 0) # no errors records = (('ATOM', 'HETATM')) resid_list = [int(l[22:26]) for l in self.stdout if l.startswith(records)] expected = [4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 301, 302, 303, 301, 301, 302, 303, 304, 305] self.assertEqual(resid_list, expected) def test_single_option_1(self): """$ pdb_shiftres -10 data/dummy.pdb""" # Simulate input # pdb_shiftres dummy.pdb sys.argv = ['', '-10', os.path.join(data_dir, 'dummy.pdb')] # Execute the script self.exec_module() # Validate results self.assertEqual(self.retcode, 0) # ensure the program exited OK. self.assertEqual(len(self.stdout), 204) # no lines deleted self.assertEqual(len(self.stderr), 0) # no errors records = (('ATOM', 'HETATM')) resid_list = [int(l[22:26]) for l in self.stdout if l.startswith(records)] expected = [14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9, 9, 9, 9, 9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 311, 312, 313, 311, 311, 312, 313, 314, 315] self.assertEqual(resid_list, expected) def test_single_option_2(self): """$ pdb_shiftres --10 data/dummy.pdb""" # Simulate input # pdb_shiftres dummy.pdb sys.argv = ['', '--10', os.path.join(data_dir, 'dummy.pdb')] # Execute the script self.exec_module() # Validate results self.assertEqual(self.retcode, 0) # ensure the program exited OK. self.assertEqual(len(self.stdout), 204) # no lines deleted self.assertEqual(len(self.stderr), 0) # no errors records = (('ATOM', 'HETATM')) resid_list = [int(l[22:26]) for l in self.stdout if l.startswith(records)] expected = [-6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -6, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -3, -3, -3, -3, -3, -3, -3, -3, -3, -3, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -7, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -5, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -11, -11, -11, -11, -11, -11, -11, -11, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, -8, 291, 292, 293, 291, 291, 292, 293, 294, 295] self.assertEqual(resid_list, expected) def test_too_many_residues(self): """$ pdb_shiftres -9998 data/dummy.pdb""" sys.argv = ['', '-9998', os.path.join(data_dir, 'dummy.pdb')] self.exec_module() self.assertEqual(self.retcode, 1) self.assertEqual(len(self.stdout), 0) self.assertEqual(len(self.stderr), 1) self.assertEqual(self.stderr[0][:22], "Cannot set residue num") # proper error message def test_file_not_found(self): """$ pdb_shiftres -10 not_existing.pdb""" afile = os.path.join(data_dir, 'not_existing.pdb') sys.argv = ['', '-10', afile] self.exec_module() self.assertEqual(self.retcode, 1) # exit code is 1 (error) self.assertEqual(len(self.stdout), 0) # nothing written to stdout self.assertEqual(self.stderr[0][:22], "ERROR!! File not found") # proper error message def test_file_missing(self): """$ pdb_shiftres -10""" sys.argv = ['', '-10'] self.exec_module() self.assertEqual(self.retcode, 1) self.assertEqual(len(self.stdout), 0) # no output self.assertEqual(self.stderr[0], "ERROR!! No data to process!") def test_helptext(self): """$ pdb_shiftres""" sys.argv = [''] self.exec_module() self.assertEqual(self.retcode, 1) # ensure the program exited gracefully. self.assertEqual(len(self.stdout), 0) # no output self.assertEqual(self.stderr, self.module.__doc__.split("\n")[:-1]) def test_invalid_option(self): """$ pdb_shiftres -A data/dummy.pdb""" sys.argv = ['', '-A', os.path.join(data_dir, 'dummy.pdb')] self.exec_module() self.assertEqual(self.retcode, 1) self.assertEqual(len(self.stdout), 0) self.assertEqual(self.stderr[0][:36], "ERROR!! You provided an invalid numb") def test_not_an_option(self): """$ pdb_shiftres 11 data/dummy.pdb""" sys.argv = ['', '11', os.path.join(data_dir, 'dummy.pdb')] self.exec_module() self.assertEqual(self.retcode, 1) self.assertEqual(len(self.stdout), 0) self.assertEqual(self.stderr[0], "ERROR! First argument is not an option: '11'") if __name__ == '__main__': from config import test_dir mpath = os.path.abspath(os.path.join(test_dir, '..')) sys.path.insert(0, mpath) # so we load dev files before any installation unittest.main()