/**
  * @covers ResourceLoaderClientHtml::setConfig
  * @covers ResourceLoaderClientHtml::setExemptStates
  * @covers ResourceLoaderClientHtml::getHeadHtml
  * @covers ResourceLoaderClientHtml::getLoad
  * @covers ResourceLoader::makeLoaderStateScript
  */
 public function testGetHeadHtml()
 {
     $context = self::makeContext();
     $context->getResourceLoader()->register(self::makeSampleModules());
     $client = new ResourceLoaderClientHtml($context);
     $client->setConfig(['key' => 'value']);
     $client->setModules(['test.top', 'test.private.top']);
     $client->setModuleStyles(['test.styles.pure', 'test.styles.private']);
     $client->setModuleScripts(['test.scripts.top']);
     $client->setExemptStates(['test.exempt' => 'ready']);
     // @codingStandardsIgnoreStart Generic.Files.LineLength
     $expected = '<script>document.documentElement.className = document.documentElement.className.replace( /(^|\\s)client-nojs(\\s|$)/, "$1client-js$2" );</script>' . "\n" . '<script>(window.RLQ=window.RLQ||[]).push(function(){' . 'mw.config.set({"key":"value"});' . 'mw.loader.state({"test.exempt":"ready","test.private.top":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.scripts.top":"loading"});' . 'mw.loader.implement("test.private.top@{blankVer}",function($,jQuery,require,module){},{"css":[]});' . 'mw.loader.load(["test.top"]);' . 'mw.loader.load("/w/load.php?debug=false\\u0026lang=nl\\u0026modules=test.scripts.top\\u0026only=scripts\\u0026skin=fallback");' . '});</script>' . "\n" . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.pure&amp;only=styles&amp;skin=fallback"/>' . "\n" . '<style>.private{}</style>' . "\n" . '<script async="" src="/w/load.php?debug=false&amp;lang=nl&amp;modules=startup&amp;only=scripts&amp;skin=fallback"></script>';
     // @codingStandardsIgnoreEnd
     $expected = self::expandVariables($expected);
     $this->assertEquals($expected, $client->getHeadHtml());
 }