Web::Chain project:    Web/t/Web-Node.t


     # Test file created outside of h2xs framework.
# Run this like so: `perl Web-Node.t'
#   doom@kzsu.stanford.edu     2004/08/27 09:05:17

#########################

# change 'tests => 1' to 'tests => last_test_to_print';

use warnings;
use strict;
$|=1;

use Test::More;
BEGIN { plan tests => 24 };

use Web::Node;

ok(1); # If we made it this far, we're ok.

#########################

#--------
# The following tests use the now-deprecated mutators.
# (Tests for the new setter/getters are below.)
{ # (sealing the old tests off in their own namespace.)

  my $given_name = "ZERO";
  my $node0 = Web::Node->new($given_name);
  my $returned_name = $node0->name;
  is($given_name, $returned_name, "Newly created node remembers it's name: $returned_name");


  my @browse = qw (WUN TEW THU-REE FOAH FAHV SEAX SEVEN_LEAVEN ATE_DATE NEIN_FEIN_McLYIN HUP123 23SKIDROW UM1_HUH2-NUH3);

  # build chain manually using the above array
  my $last_node = $node0;       # initialize
  foreach my $name (@browse) { 
    my $current_node = Web::Node->new($name);
    # last points forward at this one, and this one points back at last one
    $last_node->next($current_node);
    $current_node->prev($last_node);
    $last_node = $current_node;
  }

  my $node1 = $node0->next;
  my $node1_name = $node1->name;

  is($node1_name, $browse[0], "Stepping forward: right name for node 1: $browse[0]");

  my $node2 = $node1->next;
  my $node2_name = $node2->name();
  is($node2_name, $browse[1], "Stepping forward: right name for node 2: $browse[1]");

  my $node1_again = $node2->prev;
  my $node1_name_again = $node1_again->name;
  is($node1_name_again, $browse[0], "Stepping backward: right name for node 1 again: $browse[0]");

  my $check_name = $node1->next->next->next->name;
  is ($check_name, "$browse[3]", "Chained next access of name");

  my $test_body = <<TESTES;
This is some random 
unstructured text with 
nothing much of interest 
in it, though later it 
might have doomfiles oriented 
text, and possibly some 
html markup, e.g. links.
This depends on some design 
decisions I need to make 
soon.
TESTES


  my $null_body = $node1->body();
  is($null_body, undef, "Content (body) defaults to undef");

  $node1->body(\$test_body);
  my $check_body = ${ $node1->body() };
  is($check_body, $test_body, "Content (body) set and returned correctly later");

  ### 
  # Testing doomfile node name pattern check

  $given_name = "Zero";
  eval {
    my $bad_node = Web::Node->new($given_name);
    my $bad_name = $bad_node->name();
    print "Actually created node with bad name: $bad_name\n";
  };
  like($@, 
       qr/^Web::Node::new: $given_name is not in doomfiles node name format \(e.g. all caps with underscores\)/, 
       "Refuses to create node with invalid name: $given_name");


  $given_name = "#SINGULARITY#";
  eval {
    my $bad_node = Web::Node->new($given_name);
    my $bad_name = $bad_node->name();
    print "Actually created node with bad name: $bad_name\n";
  };
  like($@, 
       qr/^Web::Node::new: $given_name is not in doomfiles node name format \(e.g. all caps with underscores\)/, 
       "Refuses to create node with invalid name: $given_name");


  $given_name = "MORGANuBACKOFF";
  eval {
    my $bad_node = Web::Node->new($given_name);
    my $bad_name = $bad_node->name();
    print "Actually created node with bad name: $bad_name\n";
  };
  like($@, 
       qr/^Web::Node::new: $given_name is not in doomfiles node name format \(e.g. all caps with underscores\)/, 
     "Refuses to create node with invalid name: $given_name");
}

##############BOOKMARK 

#--------
# Tests for the newer set/get methods 
{ # (providing a new namespace to avoid needing new variable names)

  my $given_name = "ZEROZERO_ISLAND";
  my $node0 = Web::Node->new($given_name);
  my $returned_name = $node0->get_name;
  is($given_name, $returned_name, "Newly created node remembers it's name: $returned_name");

  my @browse = qw (WUN_ISLAND
                   TEW_ISLAND
                   THU-REE_ISLAND
                   FOAH_ISLAND
                   FAHV_ISLAND
                   SEAX_ISLAND
                   SEVEN_LEAVEN_ISLAND
                   ATE_DATE_ISLAND
                   NEIN_FEIN_McLYIN_ISLAND
                   HUP123_ISLAND
                   23SKIDROW_ISLAND
                   UM1_HUH2-NUH3_ISLAND);

  #  build chain manually using the above array
  my $last_node = $node0;       # initialize
  foreach my $name (@browse) { 
    my $current_node = Web::Node->new($name);
    # last points forward at this one, and this one points back at last one
    $last_node->set_next($current_node);
    $current_node->set_prev($last_node);
    $last_node = $current_node;
  }

  my $node1 = $node0->get_next;
  my $node1_name = $node1->get_name;

  is($node1_name, $browse[0], "Stepping forward: right name for node 1: $browse[0]");

  my $node2 = $node1->get_next;
  my $node2_name = $node2->get_name();
  is($node2_name, $browse[1], "Stepping forward: right name for node 2: $browse[1]");

  my $node1_again = $node2->get_prev;
  my $node1_name_again = $node1_again->get_name;
  is($node1_name_again, $browse[0], "Stepping backward: right name for node 1 again: $browse[0]");

  my $check_name = $node1->get_next->get_next->get_next->name;   ### A clear case where eliding "get_" on getters is clearer.
  is ($check_name, "$browse[3]", "Chained next access of name");

  my $test_body = <<TESTES;
This is some random 
unstructured text with 
nothing much of interest 
in it, though later it 
might have doomfiles oriented 
text, and possibly some 
html markup, e.g. links.
This depends on some design 
decisions I need to make 
soon: e.g. I may standardize
on using xml for this.
TESTES

  my $null_body = $node1->get_body();
  is($null_body, undef, "Content (body) defaults to undef");

  $node1->set_body(\$test_body);
  my $check_body = ${ $node1->get_body() };
  is($check_body, $test_body, "Content (body) set and returned correctly later");

  ### 
  # Testing doomfile node name pattern check

  my @bad_name = ('Zero',
                  '#SINGULARITY#',
                  'MORGANuBACKOFF',
                  'TWO WORDS',
                  'MacDONALD',
                  'AA',
                   );

  foreach $given_name (@bad_name) {
    eval {
      my $bad_node = Web::Node->new($given_name);
      my $bad_name = $bad_node->get_name();
      print "Actually created node with bad name: $bad_name\n";
    };
    like($@, 
         qr/^Web::Node::new: $given_name is not in doomfiles node name format \(e.g. all caps with underscores\)/, 
         "Refuses to create node with invalid name: $given_name");
  }
}

     

Joseph Brenner, Sat Nov 6 17:04:11 2004