<commit_before><?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\ORM\Annotation as ORM;

/**
 * @group DDC-2494
 * @group non-cacheable
 */
class DDC3192Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
    protected function setUp()
    {
        parent::setUp();

        if (Type::hasType('ddc3192_currency_code')) {
            $this->fail(
                'Type ddc3192_currency_code exists for testing DDC-3192 only, ' .
                'but it has already been registered for some reason'
            );
        }

        Type::addType('ddc3192_currency_code', DDC3192CurrencyCode::class);

        $this->schemaTool->createSchema(
            [
            $this->em->getClassMetadata(DDC3192Currency::class),
            $this->em->getClassMetadata(DDC3192Transaction::class),
            ]
        );
    }

    public function testIssue()
    {
        $currency = new DDC3192Currency('BYR');

        $this->em->persist($currency);
        $this->em->flush();

        $amount = 50;
        $transaction = new DDC3192Transaction($amount, $currency);

        $this->em->persist($transaction);
        $this->em->flush();
        $this->em->close();

        $resultByPersister = $this->em->find(DDC3192Transaction::class, $transaction->id);

        // This works: DDC2494 makes persister set type mapping info to ResultSetMapping
        self::assertEquals('BYR', $resultByPersister->currency->code);

        $this->em->close();

        $query = $this->em->createQuery();
        $query->setDQL('SELECT t FROM ' . DDC3192Transaction::class . ' t WHERE t.id = ?1');
        $query->setParameter(1, $transaction->id);

        $resultByQuery = $query->getSingleResult();

        // This is fixed here: before the fix it used to return 974.
        // because unlike the BasicEntityPersister, SQLWalker doesn't set type info
        self::assertEquals('BYR', $resultByQuery->currency->code);
    }
}

/**
 * @ORM\Table(name="ddc3192_currency")
 * @ORM\Entity
 */
class DDC3192Currency
{
    /**
     * @ORM\Id
     * @ORM\Column(type="ddc3192_currency_code")
     */
    public $code;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity=DDC3192Transaction::class, mappedBy="currency")
     */
    public $transactions;

    public function __construct($code)
    {
        $this->code = $code;
    }
}

/**
 * @ORM\Table(name="ddc3192_transaction")
 * @ORM\Entity
 */
class DDC3192Transaction
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    public $id;

    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     */
    public $amount;

    /**
     * @var \Doctrine\Tests\ORM\Functional\Ticket\DDC3192Currency
     *
     * @ORM\ManyToOne(targetEntity=DDC3192Currency::class, inversedBy="transactions")
     * @ORM\JoinColumn(name="currency_id", referencedColumnName="code", nullable=false)
     */
    public $currency;

    public function __construct($amount, DDC3192Currency $currency)
    {
        $this->amount = $amount;
        $this->currency = $currency;
    }
}

class DDC3192CurrencyCode extends Type
{
    private static $map = [
        'BYR' => 974,
    ];

    /**
     * {@inheritdoc}
     */
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return $platform->getSmallIntTypeDeclarationSQL($fieldDeclaration);
    }

    /**
     * {@inheritdoc}
     */
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return self::$map[$value];
    }

    /**
     * {@inheritdoc}
     */
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return array_search($value, self::$map, true);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'ddc3192_currency_code';
    }
}<commit_msg>Fix DDC3192Test after #6974<commit_after><?php

declare(strict_types=1);

namespace Doctrine\Tests\ORM\Functional\Ticket;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\ORM\Annotation as ORM;

/**
 * @group DDC-2494
 * @group non-cacheable
 */
class DDC3192Test extends \Doctrine\Tests\OrmFunctionalTestCase
{
    protected function setUp()
    {
        parent::setUp();

        if (Type::hasType('ddc3192_currency_code')) {
            $this->fail(
                'Type ddc3192_currency_code exists for testing DDC-3192 only, ' .
                'but it has already been registered for some reason'
            );
        }

        Type::addType('ddc3192_currency_code', DDC3192CurrencyCode::class);

        $this->schemaTool->createSchema(
            [
            $this->em->getClassMetadata(DDC3192Currency::class),
            $this->em->getClassMetadata(DDC3192Transaction::class),
            ]
        );
    }

    public function testIssue()
    {
        $currency = new DDC3192Currency('BYR');

        $this->em->persist($currency);
        $this->em->flush();

        $amount = 50;
        $transaction = new DDC3192Transaction($amount, $currency);

        $this->em->persist($transaction);
        $this->em->flush();
        $this->em->close();

        $resultByPersister = $this->em->find(DDC3192Transaction::class, $transaction->id);

        // This works: DDC2494 makes persister set type mapping info to ResultSetMapping
        self::assertEquals('BYR', $resultByPersister->currency->code);

        $this->em->close();

        $query = $this->em->createQuery();
        $query->setDQL('SELECT t FROM ' . DDC3192Transaction::class . ' t WHERE t.id = ?1');
        $query->setParameter(1, $transaction->id);

        $resultByQuery = $query->getSingleResult();

        // This is fixed here: before the fix it used to return 974.
        // because unlike the BasicEntityPersister, SQLWalker doesn't set type info
        self::assertEquals('BYR', $resultByQuery->currency->code);
    }
}

/**
 * @ORM\Table(name="ddc3192_currency")
 * @ORM\Entity
 */
class DDC3192Currency
{
    /**
     * @ORM\Id
     * @ORM\Column(type="ddc3192_currency_code")
     */
    public $code;

    /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\OneToMany(targetEntity=DDC3192Transaction::class, mappedBy="currency")
     */
    public $transactions;

    public function __construct($code)
    {
        $this->code = $code;
    }
}

/**
 * @ORM\Table(name="ddc3192_transaction")
 * @ORM\Entity
 */
class DDC3192Transaction
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    public $id;

    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     */
    public $amount;

    /**
     * @var \Doctrine\Tests\ORM\Functional\Ticket\DDC3192Currency
     *
     * @ORM\ManyToOne(targetEntity=DDC3192Currency::class, inversedBy="transactions")
     * @ORM\JoinColumn(name="currency_id", referencedColumnName="code", nullable=false)
     */
    public $currency;

    public function __construct($amount, DDC3192Currency $currency)
    {
        $this->amount = $amount;
        $this->currency = $currency;
    }
}

class DDC3192CurrencyCode extends Type
{
    private static $map = [
        'BYR' => 974,
    ];

    /**
     * {@inheritdoc}
     */
    public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
    {
        return $platform->getSmallIntTypeDeclarationSQL($fieldDeclaration);
    }

    /**
     * {@inheritdoc}
     */
    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        return self::$map[$value];
    }

    /**
     * {@inheritdoc}
     */
    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        return array_search((int) $value, self::$map, true);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'ddc3192_currency_code';
    }
}
{'fraction_non_alphanumeric': 0.14259121370067016, 'fraction_numerical': 0.028543062794738148, 'mean_word_length': 2.5549183943537717, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 77, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3869604', 'n_tokens_mistral': 2633, 'n_tokens_neox': 2481, 'n_words': 428}