#!/bin/sh

# Copyright (C) 1994-2016 Lawrence Livermore National Security, LLC.
# LLNL-CODE-425250.
# All rights reserved.
# 
# This file is part of Silo. For details, see silo.llnl.gov.
# 
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the disclaimer below.
#    * Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the disclaimer (as noted
#      below) in the documentation and/or other materials provided with
#      the distribution.
#    * Neither the name of the LLNS/LLNL nor the names of its
#      contributors may be used to endorse or promote products derived
#      from this software without specific prior written permission.
# 
# THIS SOFTWARE  IS PROVIDED BY  THE COPYRIGHT HOLDERS  AND CONTRIBUTORS
# "AS  IS" AND  ANY EXPRESS  OR IMPLIED  WARRANTIES, INCLUDING,  BUT NOT
# LIMITED TO, THE IMPLIED  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A  PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN  NO  EVENT SHALL  LAWRENCE
# LIVERMORE  NATIONAL SECURITY, LLC,  THE U.S.  DEPARTMENT OF  ENERGY OR
# CONTRIBUTORS BE LIABLE FOR  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR  CONSEQUENTIAL DAMAGES  (INCLUDING, BUT NOT  LIMITED TO,
# PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS  OF USE,  DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER  IN CONTRACT, STRICT LIABILITY,  OR TORT (INCLUDING
# NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT  OF THE USE  OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# This work was produced at Lawrence Livermore National Laboratory under
# Contract  No.   DE-AC52-07NA27344 with  the  DOE.  Neither the  United
# States Government  nor Lawrence  Livermore National Security,  LLC nor
# any of  their employees,  makes any warranty,  express or  implied, or
# assumes   any   liability   or   responsibility  for   the   accuracy,
# completeness, or usefulness of any information, apparatus, product, or
# process  disclosed, or  represents  that its  use  would not  infringe
# privately-owned   rights.  Any  reference   herein  to   any  specific
# commercial products,  process, or  services by trade  name, trademark,
# manufacturer or otherwise does not necessarily constitute or imply its
# endorsement,  recommendation,   or  favoring  by   the  United  States
# Government or Lawrence Livermore National Security, LLC. The views and
# opinions  of authors  expressed  herein do  not  necessarily state  or
# reflect those  of the United  States Government or  Lawrence Livermore
# National  Security, LLC,  and shall  not  be used  for advertising  or
# product endorsement purposes.

# -----------------------------------------------------------------------------
# Test datatype handling with force single on and off 
#
# Programmer: Mark C. Miller, Thu Jul 15 18:05:03 PDT 2010
#
# Modifications:
#
#   Mark C. Miller, Mon Aug  9 16:59:23 PDT 2010
#   Made it work for any HDF5 driver, not just DB_HDF5.
# -----------------------------------------------------------------------------
#
# Find dir where this script lives and source the shell utils script there.
#
# dirname -- "$0" gets the script’s directory even if this script is run via a
#     relative path like ../../foo/bar/gorfo.sh.
# The CDPATH= nulls that env. variable and prevents cd from printing anything
#     if CDPATH is set in the environment.
# pwd gives the absolute path after the cd has occurred. This all happens in
#     a subshell so the cwd of the current script is unchanged.
#
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
. $script_dir/silo_sh_utils.sh

#
# Ensure some specmix data is available
#
specmix_files=""
some_files=$(find_file -r tests/specmix_quad.pdb tests/testsuite.dir/*/specmix_quad.pdb)
[ $? -eq 0 ] && specmix_files="$specmix_files $some_files"
some_files=$(find_file -r tests/specmix_ucd.pdb tests/testsuite.dir/*/specmix_ucd.pdb)
[ $? -eq 0 ] && specmix_files="$specmix_files $some_files"
some_files=$(find_file -r tests/specmix_quad.h5 tests/testsuite.dir/*/specmix_quad.h5)
[ $? -eq 0 ] && specmix_files="$specmix_files $some_files"
some_files=$(find_file -r tests/specmix_ucd.h5 tests/testsuite.dir/*/specmix_ucd.h5)
[ $? -eq 0 ] && specmix_files="$specmix_files $some_files"
[ -n "$specmix_files" ] || exit 1
 
# 
# Ensure we have Silo's 'browser' tool available
# 
browser=$(find_file -x bin/browser tools/browser/browser tools/browser/.libs/browser)
[ $? -eq 0 ] || exit 1

#
# Loop over all files, variables and types with and without force single enabled
#
result=0
#echo "driver\tfsmode\tfile\tvartyp\tdattyp\tstatus"
for fsmode in "-s 1" "    "; do
    for file in $specmix_files; do
        mt=$(echo $file | cut -d'_' -f2 | cut -d'.' -f1)
        dr=$(echo $file | cut -d'_' -f2 | cut -d'.' -f2)
        if [ "${file#*.h5} != "$file ]; then
            driver=" h5"
        fi
        for v in "n" "z"; do
            for d in "c" "s" "i" "l" "L" "d"; do
                this_result=0
                browser_out=$($browser --proper-exit-code -q ${fsmode} -e "diff f${v}var ${d}${v}var" $file)
                [ $? -eq 0 ] || this_result=1
                diffs=$(echo $browser_out | grep -v 'different data sizes' | grep -v 'byte data' | grep vals | head)
                if [ $this_result -ne 0 ] || [ -n "$diffs" ]; then
                    result=1
                    echo "${dr}\t${fsmode}\t${mt}\t${v}\t${d}\tFAILED"
                else
                    echo "${dr}\t${fsmode}\t${mt}\t${v}\t${d}\tPASSED"
                fi
            done
        done
    done
done

exit $result 
