1use strict;
2use warnings;
3
4#use Test::More "no_plan";
5use Test::More tests => 49;
6
7BEGIN {
8    use_ok('Chemistry::Atom');
9    use_ok('Chemistry::Mol');
10    use_ok('Math::VectorReal');
11};
12
13my ($atom, $atom2, $atom3);
14
15# constructor
16$atom = Chemistry::Atom->new;
17isa_ok( $atom, 'Chemistry::Atom', 'blank atom' );
18isa_ok( $atom, 'Chemistry::Obj',  'blank atom' );
19
20# symbol
21$atom = Chemistry::Atom->new(symbol => 'C');
22is( $atom->symbol, 'C', 'symbol -> symbol' );
23is( $atom->Z,       6,  'symbol -> Z' );
24
25# Z
26$atom->Z(8);
27is( $atom->Z,       8,  'Z -> Z' );
28is( $atom->symbol, 'O', 'Z -> symbol' );
29
30# mass
31ok( abs($atom->mass-16.00)<0.01, 'default mass');
32$atom->mass(18.012);
33is( $atom->mass, 18.012, 'arbitrary mass' );
34
35# aromatic
36ok( ! $atom->aromatic, 'aromatic default' );
37$atom->aromatic(1);
38ok( $atom->aromatic, 'aromatic' );
39
40# default hydrogens
41ok( ! $atom->hydrogens,             'hydrogens default' );
42ok( ! $atom->total_hydrogens,       'total_hydrogens default' );
43ok( ! $atom->implicit_hydrogens,    'implicit_hydrogens default' );
44
45# set hydrogens
46$atom->hydrogens(1);
47is( $atom->hydrogens,               1,  'hydrogens' );
48is( $atom->implicit_hydrogens,      1,  'implicit_hydrogens' );
49is( $atom->total_hydrogens,         1,  'total_hydrogens' );
50
51# set implicit_hydrogens
52$atom->implicit_hydrogens(2);
53is( $atom->hydrogens,               2,  'hydrogens' );
54is( $atom->implicit_hydrogens,      2,  'implicit_hydrogens' );
55is( $atom->total_hydrogens,         2,  'total_hydrogens' );
56is( $atom->explicit_valence,        0,  'explicit_valence' );
57is( $atom->valence,                 2,  'valence' );
58
59# sprout_hydrogens
60my $mol = Chemistry::Mol->new;
61$mol->add_atom($atom);
62
63$atom->sprout_hydrogens;
64is( $atom->hydrogens,               0,  'hydrogens' );
65is( $atom->implicit_hydrogens,      0,  'implicit_hydrogens' );
66is( $atom->total_hydrogens,         2,  'total_hydrogens' );
67is( $atom->explicit_valence,        2,  'explicit_valence' );
68is( $atom->valence,                 2,  'valence' );
69
70# collapse_hydrogens
71$atom->collapse_hydrogens;
72is( $atom->hydrogens,               2,  'hydrogens' );
73is( $atom->implicit_hydrogens,      2,  'implicit_hydrogens' );
74is( $atom->total_hydrogens,         2,  'total_hydrogens' );
75is( $atom->explicit_valence,        0,  'explicit_valence' );
76is( $atom->valence,                 2,  'valence' );
77
78# coords
79$atom2 = Chemistry::Atom->new(coords => [3,0,4]);
80is( $atom->distance($atom2),    5,  'distance(coords(arrayref))' );
81my $v1 = $atom2->coords;
82isa_ok( $v1, 'Math::VectorReal');
83my $v = vector(0,10,0);
84$atom2->coords($v);
85is( $atom->distance($atom2),   10,  'distance(coords(vector))' );
86$atom2->coords(3,0,0);
87is( $atom->distance($atom2),    3,  'distance(coords(list))' );
88
89# x3, y3, z3 accessors
90$atom2->coords($v1);
91my $x = $atom2->x3;
92is($x, 3, 'x3');
93my $y = $atom2->y3;
94is($y, 0, 'y3');
95my $z = $atom2->z3;
96is($z, 4, 'z3');
97
98# distance
99is( $atom->distance($v1),       5,  'distance(vector)' );
100
101# sprintf
102is( $atom->sprintf("%s"),       'O', 'sprintf - %s' );
103is( $atom->sprintf("%Z"),       8,   'sprintf - %Z' );
104is( $atom2->sprintf("%x,%y,%z"), '3,0,4',   'sprintf - %x,%y,%z' );
105
106# mass_number
107$atom = Chemistry::Atom->new(Z => 1);
108ok( abs($atom->mass-1.008)<0.001, '1H mass');
109$atom->mass_number(2);
110is( $atom->mass_number,     2,      '2H mass number' );
111
112my $got_m2H = $atom->mass;
113my $m_2H = $INC{'Chemistry/Isotope.pm'} ? 2.014 : 2;
114ok( abs($got_m2H - $m_2H)<0.001,   '2H mass' )
115    or diag(sprintf "expected %s, got %s", $m_2H, $atom->mass);
116$atom->mass_number(10);
117is( $atom->mass,     10,             '10H mass' );
118
119