The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#   $Id: 621-output-get-create-table-sql.t,v 1.4 2009/02/28 06:54:57 aff Exp $

use warnings;
use strict;

use Data::Dumper;
use Test::More;
use Test::Exception;
use File::Spec::Functions;
use lib catdir qw ( blib lib );

plan tests => 9;

use lib q{lib};
use_ok ('Parse::Dia::SQL');
use_ok ('Parse::Dia::SQL::Output');
use_ok ('Parse::Dia::SQL::Output::DB2');

# 1. pre-parsed input for simplicity and speed.
# $table is here a hash ref containing one class ('extremes')
my $table =
  {
    'name' => 'extremes',
    'type' => 'table',
    'atts' => {
      'maxval'  => [ 'maxVal',  'numeric (15)', '', '0', undef ],
      'fmorg'   => [],
      'minval'  => [ 'minVal',  'numeric (15)', '', '0', undef ],
      'public'  => [],
      'name'    => [ 'name',    'varchar (32)', '', '2', undef ],
      'colname' => [ 'colName', 'varchar (64)', '', '0', undef ]
    },
    'ops' => [
      [ 'select', 'grant', ['public'], '', undef ],
      [ 'all',    'grant', ['fmorg'],  '', undef ]
    ],
    'uindxn'  => {},
    'pk'      => [ [ 'name', 'varchar (32)', '', '2', undef ], ],
    'uindxc'  => {},
    'attList' => [
      [ 'name',    'varchar (32)', '', '2', undef ],
      [ 'colName', 'varchar (64)', '', '0', undef ],
      [ 'minVal',  'numeric (15)', '', '0', undef ],
      [ 'maxVal',  'numeric (15)', '', '0', undef ]
    ],
  };

my $diasql = Parse::Dia::SQL->new(db => 'db2');
my $output   = undef;
isa_ok($diasql, 'Parse::Dia::SQL');

# Fool Parse::Dia::SQL into thinking convert() was called
$diasql->{converted} = 1; 

lives_ok(sub { $output = $diasql->get_output_instance(); },
  q{get_output_instance (db2) should not die});

isa_ok($output, 'Parse::Dia::SQL::Output::DB2')
  or diag(Dumper($output));
can_ok($output, 'get_schema_create');

my $create_table = $output->_get_create_table_sql($table);
#diag($create_table);

like($create_table, qr|.*
create \s+ table \s+ extremes \s* \(
    \s+ name \s+ varchar \s* \(32\) \s+ not \s+ null \s* ,
    \s+ colName \s+ varchar \s* \(64\) \s* ,
    \s+ minVal \s+ numeric \s* \(15\) \s* ,
    \s+ maxVal \s+ numeric \s* \(15\) \s* ,
		\s+ constraint \s+ pk_\w+ \s+ primary \s+ key  \s* \(name\)
    \s* \) \s* (;)?
.*|six, q{Check syntax for sql create table extremes});


# Test for table where column ('host') is both pk and marked 'not null':
my $table2 =
  {
    'atts' => {
      'nrecv'  => [ 'nrecv',  'integer',     '0',        '0', '' ],
      'level'  => [ 'level',  'integer',     '0',        '0', '' ],
      'status' => [ 'status', 'varchar(20)', '',         '0', '' ],
      'time'   => [ 'time',   'timestamp',   'not null', '0', '' ],
      'host'   => [ 'host',   'varchar(20)', 'not null', '2', '' ],
      'gui'    => [ 'gui',    'integer',     '0',        '0', '' ],
      'rate'   => [ 'rate',   'timestamp',   'not null', '0', '' ],
      'nsent'  => [ 'nsent',  'integer',     '0',        '0', '' ],
      'id'     => [ 'id',     'bigint',      'not null', '0', '' ]
    },
    'ops' => [
      [ 'idx_node_id', 'index', ['id'], '', '' ],
      [ 'idx_node_host_rate', 'index', [ 'host', 'rate' ], '', '' ]
    ],
    'uindxn'  => {},
    'pk'      => [ [ 'host', 'varchar(20)', 'not null', '2', '' ] ],
    'name'    => 'node',
    'uindxc'  => {},
    'attList' => [
      [ 'id',     'bigint',      'not null', '0', '' ],
      [ 'host',   'varchar(20)', 'not null', '2', '' ],
      [ 'time',   'timestamp',   'not null', '0', '' ],
      [ 'level',  'integer',     '0',        '0', '' ],
      [ 'gui',    'integer',     '0',        '0', '' ],
      [ 'rate',   'timestamp',   'not null', '0', '' ],
      [ 'nrecv',  'integer',     '0',        '0', '' ],
      [ 'nsent',  'integer',     '0',        '0', '' ],
      [ 'status', 'varchar(20)', '',         '0', '' ],
    ],
    'type' => 'table'
};

my $create_table2 = $output->_get_create_table_sql($table2);
#diag($create_table2);

like($create_table2, qr|.*
create \s+ table \s+ node \s* \(
 \s* id \s+ bigint \s+ not \s+ null \s* ,
 \s+ host \s+ varchar \s* \( \s* 20 \s* \) \s*  \s+ not \s+ null \s* ,
 \s+ time \s+ timestamp \s+ not \s+ null \s* ,
 \s+ level \s+ integer \s+ default \s+ 0 \s* ,
 \s+ gui \s+ integer \s+ default \s+ 0 \s* ,
 \s+ rate \s+ timestamp \s+ not \s+ null \s* ,
 \s+ nrecv \s+ integer \s+ default \s+ 0 \s* ,
 \s+ nsent \s+ integer \s+ default \s+ 0 \s* ,
 \s+ status \s+ varchar \s* \( \s* 20 \s* \) \s*  \s* ,
 \s+ constraint \s+ pk_node \s+ primary \s+ key \s+  \s* \( \s* host \s* \) \s* 
\) \s* (;)?
.*|six, q{Check syntax for column both pk and marked 'not null':});


__END__