Source code for aiida.backends.tests.tools.data.orbital.test_orbitals

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""Test for the `Orbital` class and subclasses."""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import

#from aiida import orm
from aiida.backends.testbase import AiidaTestCase
from aiida.common.exceptions import ValidationError
from aiida.tools.data.orbital import Orbital

from aiida.plugins import OrbitalFactory


[docs]class TestOrbital(AiidaTestCase): """Test the Orbital base class"""
[docs] def test_required_fields(self): """Verify that required fields are validated.""" # position is required with self.assertRaises(ValidationError): Orbital() # position must be a list of three floats with self.assertRaises(ValidationError): Orbital(position=(1, 2)) with self.assertRaises(ValidationError): Orbital(position=(1, 2, 'a')) orbital = Orbital(position=(1, 2, 3)) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][0], 1.) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][1], 2.) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][2], 3.)
[docs] def test_unknown_fields(self): """Verify that unkwown fields raise a validation error.""" # position is required # position must be a list of three floats with self.assertRaises(ValidationError) as exc: Orbital(position=(1, 2, 3), some_strange_key=1) self.assertIn('some_strange_key', str(exc.exception))
[docs]class TestRealhydrogenOrbital(AiidaTestCase): """Test the Orbital base class"""
[docs] def test_required_fields(self): """Verify that required fields are validated.""" RealhydrogenOrbital = OrbitalFactory('realhydrogen') # pylint: disable=invalid-name # Check that the required fields of the base class are not enough with self.assertRaises(ValidationError): RealhydrogenOrbital(position=(1, 2, 3)) orbital = RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2 } ) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][0], -1.) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][1], -2.) self.assertAlmostEqual(orbital.get_orbital_dict()['position'][2], -3.) self.assertAlmostEqual(orbital.get_orbital_dict()['angular_momentum'], 1) self.assertAlmostEqual(orbital.get_orbital_dict()['magnetic_number'], 0) self.assertAlmostEqual(orbital.get_orbital_dict()['radial_nodes'], 2)
[docs] def test_validation_for_fields(self): """Verify that the values are properly validated""" RealhydrogenOrbital = OrbitalFactory('realhydrogen') # pylint: disable=invalid-name with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 100, 'magnetic_number': 0, 'radial_nodes': 2 } ) self.assertIn('angular_momentum', str(exc.exception)) with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 3, 'radial_nodes': 2 } ) self.assertIn('magnetic number must be in the range', str(exc.exception)) with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 100 } ) self.assertIn('radial_nodes', str(exc.exception))
[docs] def test_optional_fields(self): """ Testing (some of) the optional parameters to check that the functionality works (they are indeed optional but accepted if specified, they are validated, ...) """ RealhydrogenOrbital = OrbitalFactory('realhydrogen') # pylint: disable=invalid-name orbital = RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2 } ) # Check that the optional value is there and has its default value self.assertEqual(orbital.get_orbital_dict()['spin'], 0) self.assertEqual(orbital.get_orbital_dict()['diffusivity'], None) orbital = RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2, 'spin': 1, 'diffusivity': 3.1 } ) self.assertEqual(orbital.get_orbital_dict()['spin'], 1) self.assertEqual(orbital.get_orbital_dict()['diffusivity'], 3.1) with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2, 'spin': 1, 'diffusivity': 'a' } ) self.assertIn('diffusivity', str(exc.exception)) with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2, 'spin': 5, 'diffusivity': 3.1 } ) self.assertIn('spin', str(exc.exception))
[docs] def test_unknown_fields(self): """Verify that unkwown fields raise a validation error.""" RealhydrogenOrbital = OrbitalFactory('realhydrogen') # pylint: disable=invalid-name with self.assertRaises(ValidationError) as exc: RealhydrogenOrbital( **{ 'position': (-1, -2, -3), 'angular_momentum': 1, 'magnetic_number': 0, 'radial_nodes': 2, 'some_strange_key': 1 } ) self.assertIn('some_strange_key', str(exc.exception))
[docs] def test_get_name_from_quantum_numbers(self): """ Test if the function ``get_name_from_quantum_numbers`` works as expected """ RealhydrogenOrbital = OrbitalFactory('realhydrogen') # pylint: disable=invalid-name name = RealhydrogenOrbital.get_name_from_quantum_numbers(angular_momentum=1) self.assertEqual(name, 'P') name = RealhydrogenOrbital.get_name_from_quantum_numbers(angular_momentum=0) self.assertEqual(name, 'S') name = RealhydrogenOrbital.get_name_from_quantum_numbers(angular_momentum=0, magnetic_number=0) self.assertEqual(name, 'S') name = RealhydrogenOrbital.get_name_from_quantum_numbers(angular_momentum=1, magnetic_number=1) self.assertEqual(name, 'PX') name = RealhydrogenOrbital.get_name_from_quantum_numbers(angular_momentum=2, magnetic_number=4) self.assertEqual(name, 'DXY')