class DesignTokenPluginManagerTest

Same name and namespace in other branches
  1. 11.x core/tests/Drupal/Tests/Core/Theme/DesignToken/DesignTokenPluginManagerTest.php \Drupal\Tests\Core\Theme\DesignToken\DesignTokenPluginManagerTest

Tests design token plugin manager.

Attributes

#[CoversClass(DesignTokenPluginManager::class)] #[Group('design_token')]

Hierarchy

Expanded class hierarchy of DesignTokenPluginManagerTest

File

core/tests/Drupal/Tests/Core/Theme/DesignToken/DesignTokenPluginManagerTest.php, line 30

Namespace

Drupal\Tests\Core\Theme\DesignToken
View source
class DesignTokenPluginManagerTest extends UnitTestCase {
  
  /**
   * The design token plugin manager.
   */
  protected DesignTokenPluginManagerInterface $designTokenPluginManager;
  
  /**
   * {@inheritdoc}
   */
  protected function setUp() : void {
    parent::setUp();
    // Mock all dependencies for DesignTokenPluginManager.
    $moduleHandler = $this->createStub(ModuleHandlerInterface::class);
    $themeHandler = $this->createStub(ThemeHandlerInterface::class);
    $cacheBackend = $this->createStub(CacheBackendInterface::class);
    $designTokenValuePluginManager = $this->createStub(DesignTokenValuePluginManagerInterface::class);
    $valuePlugins = static::getValuePlugins();
    $designTokenValuePluginManager->method('createInstance')
      ->willReturnCallback(static function (string $type, array $config) use ($valuePlugins) {
      if (isset($valuePlugins[$type])) {
        return $valuePlugins[$type];
      }
      throw new PluginException();
    });
    $this->designTokenPluginManager = new DesignTokenPluginManager($moduleHandler, $themeHandler, $cacheBackend, $designTokenValuePluginManager);
  }
  
  /**
   * Fake Design token value plugin instances.
   *
   * Consistent for assertion results.
   *
   * @return \Drupal\Core\Theme\DesignToken\DesignTokenValueInterface[]
   *   The design token value plugin instances.
   */
  protected static function getValuePlugins() : array {
    $instances = [
      'dimension' => new Dimension([
        'unit' => 'px',
        'value' => 5,
      ], 'dimension', []),
      'fontFamily' => new FontFamily([
        'value' => 'Arial',
      ], 'fontFamily', []),
      'fontWeight' => new FontWeight([
        'value' => 600,
      ], 'fontWeight', []),
      'number' => new Number([
        'value' => 5,
      ], 'number', []),
    ];
    return $instances;
  }
  
  /**
   * Tests parseDtcg.
   */
  public function testParseDtcg(array $data, ?DtcgInterface $expected) : void {
    $reflection = new \ReflectionClass($this->designTokenPluginManager);
    $method = $reflection->getMethod('parseDtcg');
    $this->assertEquals($expected, $method->invoke($this->designTokenPluginManager, 'test', 'root name', $data));
  }
  
  /**
   * Data provider for ::testParseDtcg().
   *
   * @return \Generator
   *   The test cases.
   */
  public static function providerParseDtcg() : iterable {
    $valuePlugins = static::getValuePlugins();
    yield 'One token' => [
      [
        '$type' => 'number',
        '$value' => 5,
        '$description' => 'my description',
      ],
      new DesignToken(provider: 'test', name: 'root name', value: $valuePlugins['number'], description: new TranslatableMarkup('my description'), type: 'number'),
    ];
    yield 'One group' => [
      [
        '$type' => 'number',
        '$description' => 'my description',
      ],
      new DesignTokenGroup(provider: 'test', name: 'root name', description: new TranslatableMarkup('my description'), type: 'number'),
    ];
    $group = new DesignTokenGroup(provider: 'test', name: 'root name', description: new TranslatableMarkup('my description'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group, description: new TranslatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group, description: new TranslatableMarkup('my description 2'), type: 'fontFamily');
    $group->setChildren([
      'my token 1' => $token1,
      'my token 2' => $token2,
    ]);
    yield 'One group with 2 tokens' => [
      [
        '$type' => 'number',
        '$description' => 'my description',
        'my token 1' => [
          '$type' => 'fontWeight',
          '$value' => 600,
          '$description' => 'my description 1',
        ],
        'my token 2' => [
          '$type' => 'fontFamily',
          '$value' => 'Arial',
          '$description' => 'my description 2',
        ],
      ],
      $group,
    ];
    yield 'Invalid token' => [
      [
        '$type' => 'foo',
        '$value' => 5,
        '$description' => 'invalid token',
      ],
      NULL,
    ];
    yield 'One group with 2 tokens and one invalid' => [
      [
        '$type' => 'number',
        '$description' => 'my description',
        'my token 1' => [
          '$type' => 'fontWeight',
          '$value' => 600,
          '$description' => 'my description 1',
        ],
        'my token 2' => [
          '$type' => 'fontFamily',
          '$value' => 'Arial',
          '$description' => 'my description 2',
        ],
        'my token 3' => [
          '$type' => 'foo',
          '$value' => 5,
          '$description' => 'invalid token',
        ],
      ],
      $group,
    ];
    $group1 = new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number');
    $group2 = new DesignTokenGroup(provider: 'test', name: 'sub group', parent: $group1, description: new translatableMarkup('my description 2'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group1, description: new translatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group2, description: new translatableMarkup('my description 2'), type: 'fontFamily');
    $group1->setChildren([
      'my token 1' => $token1,
      'sub group' => $group2,
    ]);
    $group2->setChildren([
      'my token 2' => $token2,
    ]);
    yield 'One group with one token and one group with one token' => [
      [
        '$type' => 'number',
        '$description' => 'my description',
        'my token 1' => [
          '$type' => 'fontWeight',
          '$value' => 600,
          '$description' => 'my description 1',
        ],
        'sub group' => [
          '$description' => 'my description 2',
          'my token 2' => [
            '$type' => 'fontFamily',
            '$value' => 'Arial',
            '$description' => 'my description 2',
          ],
        ],
      ],
      $group1,
    ];
  }
  
  /**
   * Tests flattenDefinitions.
   */
  public function testFlattenDefinitions(?DtcgInterface $data, array $expected) : void {
    $reflection = new \ReflectionClass($this->designTokenPluginManager);
    $method = $reflection->getMethod('flattenDefinitions');
    $this->assertEquals($expected, $method->invoke($this->designTokenPluginManager, $data));
  }
  
  /**
   * Data provider for ::testFlattenDefinitions().
   *
   * @return \Generator
   *   The test cases.
   */
  public static function providerFlattenDefinitions() : iterable {
    $valuePlugins = static::getValuePlugins();
    yield 'Null value' => [
      NULL,
      [],
    ];
    $token = new DesignToken(provider: 'test', name: 'root name', value: $valuePlugins['number'], description: new translatableMarkup('my description'), type: 'number');
    yield 'One token' => [
      $token,
      [
        'root_name' => $token,
      ],
    ];
    yield 'One empty group' => [
      new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number'),
      [],
    ];
    $group = new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group, description: new translatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group, description: new translatableMarkup('my description 2'), type: 'fontFamily');
    $group->setChildren([
      'my token 1' => $token1,
      'my token 2' => $token2,
    ]);
    yield 'One group with 2 tokens' => [
      $group,
      [
        'root_name.my_token_1' => $token1,
        'root_name.my_token_2' => $token2,
      ],
    ];
    $group1 = new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number');
    $group2 = new DesignTokenGroup(provider: 'test', name: 'sub group', parent: $group1, description: new translatableMarkup('my description 2'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group1, description: new translatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group2, description: new translatableMarkup('my description 2'), type: 'fontFamily');
    $group1->setChildren([
      'my token 1' => $token1,
      'sub group' => $group2,
    ]);
    $group2->setChildren([
      'my token 2' => $token2,
    ]);
    yield 'One group with one token and one group with one token' => [
      $group1,
      [
        'root_name.my_token_1' => $token1,
        'root_name.sub_group.my_token_2' => $token2,
      ],
    ];
  }
  
  /**
   * Tests extractDefinitions.
   */
  public function testExtractDefinitions(array $discovered, array $expected) : void {
    $reflection = new \ReflectionClass($this->designTokenPluginManager);
    $method = $reflection->getMethod('extractDefinitions');
    $this->assertEquals($expected, $method->invoke($this->designTokenPluginManager, $discovered));
  }
  
  /**
   * Data provider for ::testExtractDefinitions().
   *
   * @return \Generator
   *   The test cases.
   */
  public static function providerExtractDefinitions() : iterable {
    $valuePlugins = static::getValuePlugins();
    yield 'None discovered' => [
      [],
      [],
    ];
    yield 'Invalid token' => [
      [
        'id 1' => [
          'id' => 'id 1',
          'provider' => 'test',
          '$type' => 'foo',
          '$value' => 5,
          '$description' => 'invalid token',
        ],
      ],
      [],
    ];
    yield 'One token' => [
      [
        'id 1' => [
          'id' => 'id 1',
          'provider' => 'test',
          '$type' => 'number',
          '$value' => 5,
          '$description' => 'my description',
        ],
      ],
      [
        'id_1' => new DesignToken(provider: 'test', name: 'id 1', value: $valuePlugins['number'], description: new translatableMarkup('my description'), type: 'number'),
      ],
    ];
    yield 'One empty group' => [
      [
        'id 1' => [
          'id' => 'id 1',
          'provider' => 'test',
          '$type' => 'number',
          '$description' => 'my description',
        ],
      ],
      [],
    ];
    $group = new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group, description: new translatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group, description: new translatableMarkup('my description 2'), type: 'fontFamily');
    $group->setChildren([
      'my token 1' => $token1,
      'my token 2' => $token2,
    ]);
    yield 'One group with 2 tokens' => [
      [
        'root name' => [
          'id' => 'root name',
          'provider' => 'test',
          '$type' => 'number',
          '$description' => 'my description',
          'my token 1' => [
            '$type' => 'fontWeight',
            '$value' => 600,
            '$description' => 'my description 1',
          ],
          'my token 2' => [
            '$type' => 'fontFamily',
            '$value' => 'Arial',
            '$description' => 'my description 2',
          ],
        ],
      ],
      [
        'root_name.my_token_1' => $token1,
        'root_name.my_token_2' => $token2,
      ],
    ];
    yield 'One group with 2 tokens and one invalid' => [
      [
        'root name' => [
          'id' => 'root name',
          'provider' => 'test',
          '$type' => 'number',
          '$description' => 'my description',
          'my token 1' => [
            '$type' => 'fontWeight',
            '$value' => 600,
            '$description' => 'my description 1',
          ],
          'my token 2' => [
            '$type' => 'fontFamily',
            '$value' => 'Arial',
            '$description' => 'my description 2',
          ],
          'my token 3' => [
            '$type' => 'foo',
            '$value' => 5,
            '$description' => 'invalid token',
          ],
        ],
      ],
      [
        'root_name.my_token_1' => $token1,
        'root_name.my_token_2' => $token2,
      ],
    ];
    $group1 = new DesignTokenGroup(provider: 'test', name: 'root name', description: new translatableMarkup('my description'), type: 'number');
    $group2 = new DesignTokenGroup(provider: 'test', name: 'sub group', parent: $group1, description: new translatableMarkup('my description 2'), type: 'number');
    $token1 = new DesignToken(provider: 'test', name: 'my token 1', value: $valuePlugins['fontWeight'], parent: $group1, description: new translatableMarkup('my description 1'), type: 'fontWeight');
    $token2 = new DesignToken(provider: 'test', name: 'my token 2', value: $valuePlugins['fontFamily'], parent: $group2, description: new translatableMarkup('my description 2'), type: 'fontFamily');
    $group1->setChildren([
      'my token 1' => $token1,
      'sub group' => $group2,
    ]);
    $group2->setChildren([
      'my token 2' => $token2,
    ]);
    yield 'One group with one token and one group with one token' => [
      [
        'root name' => [
          'id' => 'root name',
          'provider' => 'test',
          '$type' => 'number',
          '$description' => 'my description',
          'my token 1' => [
            '$type' => 'fontWeight',
            '$value' => 600,
            '$description' => 'my description 1',
          ],
          'sub group' => [
            '$description' => 'my description 2',
            'my token 2' => [
              '$type' => 'fontFamily',
              '$value' => 'Arial',
              '$description' => 'my description 2',
            ],
          ],
        ],
      ],
      [
        'root_name.my_token_1' => $token1,
        'root_name.sub_group.my_token_2' => $token2,
      ],
    ];
  }

}

Members

Title Sort descending Deprecated Modifiers Object type Summary Overriden Title Overrides
DesignTokenPluginManagerTest::$designTokenPluginManager protected property The design token plugin manager.
DesignTokenPluginManagerTest::getValuePlugins protected static function Fake Design token value plugin instances.
DesignTokenPluginManagerTest::providerExtractDefinitions public static function Data provider for ::testExtractDefinitions().
DesignTokenPluginManagerTest::providerFlattenDefinitions public static function Data provider for ::testFlattenDefinitions().
DesignTokenPluginManagerTest::providerParseDtcg public static function Data provider for ::testParseDtcg().
DesignTokenPluginManagerTest::setUp protected function Overrides UnitTestCase::setUp
DesignTokenPluginManagerTest::testExtractDefinitions public function Tests extractDefinitions.
DesignTokenPluginManagerTest::testFlattenDefinitions public function Tests flattenDefinitions.
DesignTokenPluginManagerTest::testParseDtcg public function Tests parseDtcg.
DrupalTestCase::$root protected property The Drupal root directory.
DrupalTestCase::getDrupalRoot Deprecated protected function Returns the Drupal root directory. 1
DrupalTestCase::setUpRoot final protected function Ensure that the $root property is set initially.
DrupalTestCase::skipTestWithAttribute final protected function Supports skipping tests with the Skip attribute.
DrupalTestCaseTrait::checkErrorHandlerOnTearDown public function Checks the test error handler after test execution. 1
DrupalTestCaseTrait::expectExceptionMessageIs protected function Expects an exactly matching exception message.
DrupalTestCaseTrait::expectExceptionMessageIsOrContains protected function Expects an exception message containing a specified string.
DrupalTestCaseTrait::setDebugDumpHandler public static function Registers the dumper CLI handler when the DebugDump extension is enabled.
RandomGeneratorTrait::getRandomGenerator protected function Gets the random generator for the utility methods.
RandomGeneratorTrait::randomMachineName protected function Generates a unique random string containing letters and numbers.
RandomGeneratorTrait::randomObject public function Generates a random PHP object.
RandomGeneratorTrait::randomString public function Generates a pseudo-random string of ASCII characters of codes 32 to 126.
UnitTestCase::getClassResolverStub protected function Returns a stub class resolver.
UnitTestCase::getConfigFactoryStub public function Returns a stub config factory that behaves according to the passed array.
UnitTestCase::getContainerWithCacheTagsInvalidator protected function Sets up a container with a cache tags invalidator.
UnitTestCase::getStringTranslationStub public function Returns a stub translation manager that just returns the passed string.
UnitTestCase::setupMockIterator protected function Set up a traversable class mock to return specific items when iterated.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.