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