<?php
/**
 * Copyright 2015 Adobe
 * All Rights Reserved.
 */
declare(strict_types=1);

namespace Magento\Catalog\Test\Unit\Helper;

use PHPUnit\Framework\Attributes\DataProvider;
use Magento\Catalog\Helper\Product;
use Magento\Catalog\Model\Product as ProductModel;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
use PHPUnit\Framework\TestCase;

class ProductTest extends TestCase
{
    /**
     * @var Product
     */
    protected $_productHelper;

    protected function setUp(): void
    {
        $arguments = [
            'reindexPriceIndexerData' => [
                'byDataResult' => ['attribute'],
                'byDataChange' => ['attribute'],
            ],
        ];

        $objectManager = new ObjectManager($this);
        $this->_productHelper = $objectManager->getObject(Product::class, $arguments);
    }

    /**
     * @param mixed $data
     * @param boolean $result
     */
    #[DataProvider('getData')]
    public function testIsDataForPriceIndexerWasChanged($data, $result)
    {
        if (is_callable($data)) {
            $data = $data($this);
        }
        $this->assertEquals($this->_productHelper->isDataForPriceIndexerWasChanged($data), $result);
    }

    protected function getMockForCatalogProduct($method)
    {
        $product = $this->createMock(ProductModel::class);
        if ($method!=null) {
            $product->expects(
                $this->once()
            )->method(
                $method
            )->with(
                'attribute'
            )->willReturn(
                true
            );
        }
        return $product;
    }
    /**
     * Data provider for testIsDataForPriceIndexerWasChanged
     * @return array
     */
    public static function getData()
    {
        $product1 = static fn (self $testCase) => $testCase->getMockForCatalogProduct(null);

        $product2 = static fn (self $testCase) => $testCase->getMockForCatalogProduct("getData");

        $product3 = static fn (self $testCase) => $testCase->getMockForCatalogProduct("dataHasChangedFor");

        return [
            [$product1, false],
            [$product2, true],
            [$product3, true],
            [['attribute' => ''], true],
            [['param' => ''], false],
            ['test', false]
        ];
    }
}
