1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
import sys
import pytest
from ase.build import bulk
from ase.io import read
from ase.visualize import view
from ase.visualize.viewers import CLI_VIEWERS, CLIViewer, PyViewer
@pytest.fixture()
def atoms():
return bulk('Au')
def test_view_ase(atoms):
viewer = view(atoms)
assert viewer.poll() is None
# Can we stop in a different way?
viewer.terminate()
status = viewer.wait()
assert status != 0
def test_view_ase_via_cli(atoms):
# Not a very good test, how can we assert something about the viewer?
viewer = view(atoms, viewer='ase_gui_cli')
assert viewer.poll() is None
viewer.terminate()
status = viewer.wait()
assert status != 0
viewers = [
# `ase` # tested above
'ngl',
# 'mlab', # TODO: make it available
# 'sage', # TODO: make it available
'x3d',
# 'avogadro', # TODO: no CLI?
# `ase_gui_cli` # tested above
# 'gopenmol', # TODO: no CLI?
# 'rasmol', # TODO: no CLI?
# `vmd`, # TODO: no CLI?
# 'xmakemol', # TODO: no CLI?
]
# At the moment nglview raises a DeprecationWarning.
# https://github.com/nglviewer/nglview/issues/1074
@pytest.mark.filterwarnings("ignore::DeprecationWarning")
@pytest.mark.parametrize('viewer', viewers)
def test_good_viewer(atoms, viewer):
"""Test if `viewer` can at least be called without errors."""
if viewer == 'ngl':
pytest.importorskip('nglview')
elif viewer == 'x3d':
pytest.importorskip('IPython')
view(atoms, viewer=viewer)
def test_bad_viewer(atoms):
with pytest.raises(KeyError):
view(atoms, viewer='_nonexistent_viewer')
def test_py_viewer_mock(atoms, monkeypatch):
def mock_view(self, atoms, repeat=None, **kwargs):
if repeat is not None:
atoms = atoms.repeat(repeat)
print(f'viewing {atoms} with mock "{self.name}"')
return (atoms, self.name)
monkeypatch.setattr(PyViewer, 'view', mock_view, raising=False)
(atoms1, name1) = view(atoms, viewer='sage')
assert name1 == 'sage'
assert atoms1 == atoms
atoms2, name2 = view(atoms, viewer='sage', repeat=(2, 2, 2), block=True)
assert name2 == 'sage'
assert len(atoms2) == 8 * len(atoms)
@pytest.mark.parametrize('viewer', CLI_VIEWERS.values())
def test_cli_viewer_tempfile(atoms, viewer):
with viewer.mktemp(atoms) as path:
atoms1 = read(path)
# Some formats do not include cell etc., so we only check that
# the atoms are "consistent-ish".
# Note: This would fail if we forgot to flush() in mktemp().
assert all(atoms1.symbols == atoms.symbols)
assert not path.exists()
@pytest.fixture()
def mock_viewer():
return CLIViewer('dummy', 'traj', [sys.executable, '-m', 'ase', 'info',
'--files'])
def test_cli_viewer_blocking(atoms, mock_viewer):
mock_viewer.view_blocking(atoms)
def test_cli_viewer(atoms, mock_viewer):
handle = mock_viewer.view(atoms)
status = handle.wait()
assert status == 0
|