blob: 8f16f4a6856c6aa55c940b53adcb416f16f34fb9 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
use strict;
use warnings;
use Test::More tests => 24;
use Clownfish::CFC::Model::Hierarchy;
use File::Spec::Functions qw( catdir catfile splitpath );
use File::Path qw( rmtree );
my $base_dir = catdir(qw( t cfbase ));
my $ext_dir = catdir(qw( t cfext ));
my $dest_dir = catdir(qw( t cfdest ));
# One source, one include
{
my $hierarchy = Clownfish::CFC::Model::Hierarchy->new(dest => $dest_dir);
$hierarchy->add_source_dir($ext_dir);
is_deeply( $hierarchy->get_source_dirs, [ $ext_dir ], "get_source_dirs" );
$hierarchy->add_include_dir($base_dir);
is_deeply( $hierarchy->get_include_dirs, [ $base_dir ],
"get_include_dirs" );
$hierarchy->build;
my $classes = $hierarchy->ordered_classes;
is( scalar @$classes, 5, "all classes" );
my $num_included = 0;
for my $class (@$classes) {
die "not a Class"
unless isa_ok( $class, "Clownfish::CFC::Model::Class" );
my $expect;
if ($class->get_class_name eq "Animal::Rottweiler") {
$expect = 0;
my $parent_name = $class->get_parent->get_class_name;
is( $parent_name, "Animal::Dog", "parent of included class" );
}
else {
$expect = 1;
}
my $included = $class->included ? 1 : 0;
++$num_included if $included;
is( $included, $expect, "included" );
}
is( $num_included, 4, "included class count" );
Clownfish::CFC::Model::Class->_clear_registry();
Clownfish::CFC::Model::Parcel->reap_singletons();
}
# Two sources
{
my $hierarchy = Clownfish::CFC::Model::Hierarchy->new(dest => $dest_dir);
$hierarchy->add_source_dir($base_dir);
$hierarchy->add_source_dir($ext_dir);
is_deeply( $hierarchy->get_source_dirs, [ $base_dir, $ext_dir ],
"get_source_dirs" );
is_deeply( $hierarchy->get_include_dirs, [], "get_include_dirs" );
$hierarchy->build;
my $classes = $hierarchy->ordered_classes;
is( scalar @$classes, 5, "all classes" );
for my $class (@$classes) {
die "not a Class" unless isa_ok( $class, "Clownfish::CFC::Model::Class" );
if ($class->get_class_name eq "Animal::Rottweiler") {
my $parent_name = $class->get_parent->get_class_name;
is( $parent_name, "Animal::Dog", "parent of class from second source" );
}
}
Clownfish::CFC::Model::Class->_clear_registry();
Clownfish::CFC::Model::Parcel->reap_singletons();
}
# Clean up.
rmtree($dest_dir);