<?php
/**
 * 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.
 */

require_once('test_helper.php');

class NameExample
{
  var $is_valid;
  var $name;
  var $namespace;
  var $default_namespace;
  var $expected_fullname;
  function __construct($name, $namespace, $default_namespace, $is_valid,
                       $expected_fullname=null)
  {
    $this->name = $name;
    $this->namespace = $namespace;
    $this->default_namespace = $default_namespace;
    $this->is_valid = $is_valid;
    $this->expected_fullname = $expected_fullname;
  }

  function __toString()
  {
    return var_export($this, true);
  }
}

class NameTest extends PHPUnit_Framework_TestCase
{

  function fullname_provider()
  {
    $examples = array(new NameExample('foo', null, null, true, 'foo'),
                      new NameExample('foo', 'bar', null, true, 'bar.foo'),
                      new NameExample('bar.foo', 'baz', null, true, 'bar.foo'),
                      new NameExample('_bar.foo', 'baz', null, true, '_bar.foo'),
                      new NameExample('bar._foo', 'baz', null, true, 'bar._foo'),
                      new NameExample('3bar.foo', 'baz', null, false),
                      new NameExample('bar.3foo', 'baz', null, false),
                      new NameExample('b4r.foo', 'baz', null, true, 'b4r.foo'),
                      new NameExample('bar.f0o', 'baz', null, true, 'bar.f0o'),
                      new NameExample(' .foo', 'baz', null, false),
                      new NameExample('bar. foo', 'baz', null, false),
                      new NameExample('bar. ', 'baz', null, false)
                      );
    $exes = array();
    foreach ($examples as $ex)
      $exes []= array($ex);
    return $exes;
  }

  /**
   * @dataProvider fullname_provider
   */
  function test_fullname($ex)
  {
    try
    {
      $name = new AvroName($ex->name, $ex->namespace, $ex->default_namespace);
      $this->assertTrue($ex->is_valid);
      $this->assertEquals($ex->expected_fullname, $name->fullname());
    }
    catch (AvroSchemaParseException $e)
    {
      $this->assertFalse($ex->is_valid, sprintf("%s:\n%s",
                                                $ex,
                                                $e->getMessage()));
    }
  }

  function name_provider()
  {
    return array(array('a', true),
                 array('_', true),
                 array('1a', false),
                 array('', false),
                 array(null, false),
                 array(' ', false),
                 array('Cons', true));
  }

  /**
   * @dataProvider name_provider
   */
  function test_name($name, $is_well_formed)
  {
    $this->assertEquals(AvroName::is_well_formed_name($name), $is_well_formed, $name);
  }
}
