<?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
 *
 *     https://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 InterOpTest extends PHPUnit\Framework\TestCase
{
  var $projection_json;
  var $projection;

  public function setUp(): void
  {
    $interop_schema_file_name = AVRO_INTEROP_SCHEMA;
    $this->projection_json = file_get_contents($interop_schema_file_name);
    $this->projection = AvroSchema::parse($this->projection_json);
  }

  public function file_name_provider()
  {
    $data_dir = AVRO_BUILD_DATA_DIR;
    $data_files = array();
    if (!($dh = opendir($data_dir)))
      die("Could not open data dir '$data_dir'\n");

    while ($file = readdir($dh))
      if (0 < preg_match('/^[a-z]+(_deflate|_snappy|_zstandard|_bzip2)?\.avro$/', $file))
        $data_files []= implode(DIRECTORY_SEPARATOR, array($data_dir, $file));
    closedir($dh);

    $ary = array();
    foreach ($data_files as $df)
      $ary []= array($df);
    return $ary;
  }

  /**
   *  @dataProvider file_name_provider
   */
  public function test_read($file_name)
  {

    $dr = AvroDataIO::open_file(
      $file_name, AvroFile::READ_MODE, $this->projection_json);

    $data = $dr->data();

    $this->assertNotEquals(0, count($data),
                           sprintf("no data read from %s", $file_name));

    foreach ($data as $idx => $datum)
      $this->assertNotNull($datum, sprintf("null datum from %s", $file_name));

  }

}
