diff _test/Test/Web/View.pm @ 367:608e74bc309f

form metadata, mostly done
author cin
date Tue, 03 Dec 2013 17:55:36 +0400
parents aeeb57a12046
children 010ceafd0c5a
line wrap: on
line diff
--- a/_test/Test/Web/View.pm	Mon Dec 02 17:44:38 2013 +0400
+++ b/_test/Test/Web/View.pm	Tue Dec 03 17:55:36 2013 +0400
@@ -4,21 +4,26 @@
 use warnings;
 use utf8;
 
-use parent qw(IMPL::Test::Unit);
-__PACKAGE__->PassThroughArgs;
-
 use File::Slurp;
 use Scalar::Util qw(weaken);
 use Data::Dumper;
 use IMPL::lang;
 use IMPL::Test qw(assert assertarray test GetCallerSourceLine);
-use IMPL::Web::View::TTLoader();
 
-use constant {
-    TTLoader => 'IMPL::Web::View::TTLoader',
-    MProfiler => 'IMPL::Profiler::Memory'
+use IMPL::declare {
+	require => {
+		FormMeta => 'IMPL::Web::View::Metadata::FormMeta',
+		Schema => 'IMPL::DOM::Schema',
+		Builder => 'IMPL::DOM::Navigator::Builder',
+		Document => 'IMPL::DOM::Document',
+		XMLReader => 'IMPL::DOM::XMLReader'
+	},
+	base => [
+		'IMPL::Test::Unit' => '@_'
+	]
 };
 
+
 sub AssertMemoryLeak {
     my $code = shift;
     my $dump = shift;
@@ -33,199 +38,40 @@
 }
 
 sub templatesDir {
-    $_[0]->GetResourceDir('Resources','TTView');
-}
-
-sub CreateLoader {
-    my ($this) = @_;
-    
-    my $loader = TTLoader->new(
-        {
-            INCLUDE_PATH => [
-                $this->templatesDir
-            ],
-            INTERPOLATE => 1,
-            POST_CHOMP => 1,
-            ENCODING => 'utf-8'
-        },
-        ext => '.tt',
-        initializer => 'global.tt',
-        globals => {
-            site => {
-                name => 'Test Site'
-            },
-            date => {
-                now => sub { localtime(time); }
-            },
-            dynamic => sub { 'this is a dynamic value' },
-            view => {
-            }
-        },
-        layoutBase => 'Layout'
-    );
+    shift->GetResourceDir('Resources','TTView');
 }
 
-test TTLoaderTests => sub {
-    my ($this) = @_;
-    
-    my $loader = $this->CreateLoader();
-    
-    # test the loader to be able to find a desired resource
-    assert( defined($loader->template('simple') ) );
-    
-    # loader should be initialized on demand
-    assert( not $loader->isInitialized );
-    
-    # loader should be able to load a document
-    my $doc = $loader->document('simple');
-    assert(defined $doc);
-    
-    assert( $loader->isInitialized );
-    assert( $loader->context->stash->get('user') eq 'test_user');
-    
-    # document should inherit loader's context 
-    assert( $doc->context->stash->get('user') eq 'test_user');
-    
-    # document should not have 'this' template variable
-    
-    assert( $doc->context != $loader->context); # document should have an own context
-};
+test TestFormMetadata => sub {
+	my ($this) = @_;
+	
+	my $schema = Schema->LoadSchema($this->GetResourceFile('Resources','person.schema.xml'));
+	my $builder = Builder->new(Document, $schema);
+	
+	my $reader = XMLReader->new( Navigator => $builder );
+	
+	$reader->ParseFile("Resources/person_info.xml");
+	
+	my $doc = $builder->document;
+	my @errors = $builder->buildErrors;
+	
+	push @errors, $schema->Validate($doc);
+	
+	my $meta = FormMeta->new(
+		$doc,
+		$doc->schemaSource->type,
+		{
+			decl => $doc->schemaSource,
+			schema => $doc->schema,
+			errors => \@errors
+		}
+	); 
 
-test TTDocumentTests => sub {
-    my ($this) = @_;
-    my $loader = $this->CreateLoader();
-    
-    my $doc = $loader->document('simple');
-    
-    assert(defined $doc);
-    
-    $doc->title('test document');
-    $doc->name('document');
-    
-    assert($doc->name eq 'document');
-    assert($doc->title eq 'test document');
-    
-    assert(not $doc->can('notexists')); # autoloaded property should be ignored
-    assert(not defined $doc->notexists); # nonexisting property 
-    assert($doc->template->version == 10); # static metadata
-    assert($doc->context->stash->get('user') eq 'test_user' ); # runtime context should be derived from documentContext
-    
-    my $text = $doc->Render();
-    my $expected = read_file($this->GetResourceFile('Resources','TTView.Output','simple.txt'), binmode => ':utf8');
-    
-    assert($text eq $expected, "Bad Render() output","Got: $text", "Expected: $expected");
-    
+	my $props = $meta->GetProperties;
+	
+	my $prop = $meta->GetProperty('address');
+	
+	join ',', map $_->GetProperty('line')->name, @{$prop->GetItems};
 };
 
-test TestDocumentLayout => sub {
-    my ($this) = @_;
-    
-    my $loader = $this->CreateLoader();
-    
-    my $doc = $loader->document(
-        'complex',
-        {
-            data => [qw(one two three)],
-            site => {
-                name => 'Test Site'
-            }
-        }
-    );
-    
-    assert($doc->layout eq 'default');
-    
-    my $text = $doc->Render();
-    my $expected = read_file($this->GetResourceFile('Resources', 'TTView.Output', 'complex.default.txt'), binmode => ':utf8' );
-    my ($text_raw,$expected_raw) = ($text, $expected);
-    $text_raw =~ s/\s+//g;
-    $expected_raw =~ s/\s+//g;
-    assert($text_raw eq $expected_raw, '$doc->Render(): Bad output', "Got:      $text", "Expected: $expected"); 
-};
-
-test TestControlInheritance => sub {
-    my ($this) = @_;
-    
-    my $loader = $this->CreateLoader();
-    my $doc = $loader->document('derived');
-    
-    my $text = $doc->Render();
-    my $expected = read_file($this->GetResourceFile('Resources', 'TTView.Output', 'derived.txt'), binmode => ':utf8' );
-    
-    my ($text_raw,$expected_raw) = ($text, $expected);
-    $text_raw =~ s/\s+//g;
-    $expected_raw =~ s/\s+//g;
-    
-    assert($text_raw eq $expected_raw, '$doc->Render(): Bad output', "Got:      $text", "Expected: $expected");
-};
-
-test TestDocumentsIsolation => sub {
-	my $this = shift;
-	
-	my $loader = $this->CreateLoader();
-    
-    my $doc = $loader->document('simple');
-    
-    assert(ref $loader->context->stash->get([ 'dojo', 0, 'require', 0]) eq 'ARRAY');
-    assertarray($loader->context->stash->get([ 'dojo', 0, 'require', 0]),[]);
-    assert($loader->context->stash != $doc->context->stash);
-    
-    assert(defined $doc);
-    
-    # only root stash variables can be localized, to avoid modifying dojo we
-    # need to replace it completely 
-    $doc->context->process(\q{
-    	[% SET dojo = { require => [] } %]
-    	[% dojo.require.push('dijit/form/TextBox') %]
-    	[% SET user = 'dummy guy' %]
-    });
-    
-    assert($doc->context->stash->get('user') eq 'dummy guy');
-    assert($loader->context->stash->get('user') eq 'test_user');
-    assertarray($doc->context->stash->get([ 'dojo', 0, 'require', 0]),['dijit/form/TextBox']);
-    assertarray($loader->context->stash->get([ 'dojo', 0, 'require', 0]),[]);
-    
-    my $text = $doc->Render();
-    
-    my $doc2 = $loader->document('complex');
-    
-    assertarray($doc2->context->stash->get([ 'dojo', 0, 'require', 0]),[]);
-    
-    # This document has a layout ehich will replace 'dojo' global variable.
-    # The layout contains INIT block which runs first in the context of the
-    # document, then RenderContent is called and then the layout is applied
-    $doc2->Render();
-    
-    assertarray($loader->context->stash->get([ 'dojo', 0, 'require', 0]),[]);
-    
-    # TODO: to be able to rendered multiple times, Render shouldn't affect the context of the document
-    #assertarray($doc2->context->stash->get([ 'dojo', 0, 'require', 0]),[]);
-};
-
-test TestMemoryLeaks => sub {
-    my ($this) = @_;
-    
-    my $loader = $this->CreateLoader();
-    $loader->document('simple'); # force loader initialization
-    
-    AssertMemoryLeak(sub {        
-        my $doc = $loader->document('simple');
-    },'dump');
-        
-    AssertMemoryLeak(sub {
-        my $doc = $loader->document('simple');
-        $doc->Render( { self => $doc } );
-    },'dump');
-    
-    $loader->template('Layout/default');
-    $loader->template('My/Org/Panel');
-    $loader->template('My/Org/TextPreview');
-    
-    $loader->template('complex');
-    AssertMemoryLeak(sub {
-        my $doc = $loader->document('complex');
-        $doc->Render();
-    },'dump');
-    
-};
 
 1;
\ No newline at end of file