# Copyright(C) 1999-2020 National Technology & Engineering Solutions
# of Sandia, LLC (NTESS).  Under the terms of Contract DE-NA0003525 with
# NTESS, the U.S. Government retains certain rights in this software.
#
# 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 following disclaimer.
#
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#
#     * Neither the name of NTESS 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 THE COPYRIGHT
# OWNER 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.

from phactori import *
import unittest
from Operation.PhactoriSampledCellInfo import *
#from .PhactoriSampledCellInfo import *
from paraview.simple import *

class TestPhactoriSampledCellInfo(unittest.TestCase):
  def test_TerseOneLineJsonFormatComment(self):
    outstr = PhactoriSampledCellInfo.TerseOneLineJsonFormatComment()
    self.assertEqual(outstr, '{"PhactoriSampledCellInfo output format 1 info":[\n" [cellTestPoint, ijk, dataTuple, pid, index, segmentIndex, collectionAxis]",\n" cellTestPoint is [X, Y, Z], ijk is [i, j, k], dataTuple is [c1, c2, ... cN]"]}')

    jj = json.loads(outstr)
    self.assertEqual(jj["PhactoriSampledCellInfo output format 1 info"][1], " cellTestPoint is [X, Y, Z], ijk is [i, j, k], dataTuple is [c1, c2, ... cN]")

  def test_ToStrTerseOneLineJson(self):
    PhactoriSampledCellInfoInstance = PhactoriSampledCellInfo()
    outstr = PhactoriSampledCellInfoInstance.ToStrTerseOneLineList()
    self.assertEqual(outstr, "[[0.0, 0.0, 0.0], [-1, -1, -1], [], -1, -1, -1, -1, 2]")
    jj = json.loads(outstr)
    self.assertEqual(jj[1][2], -1)
    self.assertEqual(jj[0][1], 0.0)

  def test_SetFromList(self):
    PhactoriSampledCellInfoInstance = PhactoriSampledCellInfo()
    testString = "[[1.125, 2.225, 3.325], [5, 6, 7], [-4.425, 5.525, -6.625], 8, 9, 10, 11, 1]"
    jj = json.loads(testString)
    PhactoriSampledCellInfoInstance.SetFromList(jj)
    self.assertEqual(PhactoriSampledCellInfoInstance.cellTestPoint, [1.125, 2.225, 3.325])
    self.assertEqual(PhactoriSampledCellInfoInstance.ijk, [5, 6, 7])
    self.assertEqual(PhactoriSampledCellInfoInstance.collectionAxis, 1)

    jj2 = json.loads(PhactoriSampledCellInfoInstance.ToStrTerseOneLineList())
    self.assertEqual(jj, jj2)

  def test_PhactoriFindCellWithMinMaxDataOnThisProcess(self):
    testWavelet2 = Wavelet()
    testWavelet2.UpdatePipeline()
    testWavelet = PointDatatoCellData(Input=testWavelet2)
    testWavelet.UpdatePipeline()
    minCellmaxCellPair = PhactoriFindCellWithMinMaxDataOnThisProcess(testWavelet, "RTData")
    myDebugPrint3("unittest min cell:\n")
    myDebugPrint3(minCellmaxCellPair[0].ToStrTerseOneLineList() + "\n")
    myDebugPrint3("unittest max cell:\n")
    myDebugPrint3(minCellmaxCellPair[1].ToStrTerseOneLineList() + "\n")
    minCellGoldString = "[[-9.5, 9.5, 9.5], [-1, -1, -1], [55.2607421875], 0, -1, 7980, -1, -1]"
    maxCellGoldString = "[[-0.5, -0.5, -0.5], [-1, -1, -1], [264.2397155761719], 0, -1, 3789, -1, -1]"
    self.assertEqual(minCellmaxCellPair[0].ToStrTerseOneLineList(), minCellGoldString)
    self.assertEqual(minCellmaxCellPair[1].ToStrTerseOneLineList(), maxCellGoldString)

  def test_PhactoriFindCellWtihMinMaxDataUsingMPI(self):
    testWavelet2 = Wavelet()
    testWavelet2.UpdatePipeline()
    testWavelet = PointDatatoCellData(Input=testWavelet2)
    testWavelet.UpdatePipeline()
    minCellmaxCellPair = PhactoriFindCellWtihMinMaxDataUsingMPI(testWavelet, "RTData")
    myDebugPrint3("unittest min cell:\n")
    myDebugPrint3(minCellmaxCellPair[0].ToStrTerseOneLineList() + "\n")
    myDebugPrint3("unittest max cell:\n")
    myDebugPrint3(minCellmaxCellPair[1].ToStrTerseOneLineList() + "\n")
    minCellGoldString = "[[-9.5, 9.5, 9.5], [-1, -1, -1], [55.2607421875], 0, -1, -1, -1, 2]"
    maxCellGoldString = "[[-0.5, -0.5, -0.5], [-1, -1, -1], [264.2397155761719], 0, -1, -1, -1, 2]"
    self.assertEqual(minCellmaxCellPair[0].ToStrTerseOneLineList(), minCellGoldString)
    self.assertEqual(minCellmaxCellPair[1].ToStrTerseOneLineList(), maxCellGoldString)

if __name__ == '__main__':
    cc = Cone()
    rr = Show()
    unittest.main()

