libraries.test 26.1 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573
<?php

/**
 * @file
 * Tests for Libraries API.
 */

/**
 * Tests basic Libraries API functions.
 */
class LibrariesUnitTestCase extends DrupalUnitTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Libraries API unit tests',
      'description' => 'Tests basic functions provided by Libraries API.',
      'group' => 'Libraries API',
    );
  }

  function setUp() {
    drupal_load('module', 'libraries');
    parent::setUp();
  }

  /**
   * Tests libraries_get_path().
   */
  function testLibrariesGetPath() {
    // Note that, even though libraries_get_path() doesn't find the 'example'
    // library, we are able to make it 'installed' by specifying the 'library
    // path' up-front. This is only used for testing purposed and is strongly
    // discouraged as it defeats the purpose of Libraries API in the first
    // place.
    $this->assertEqual(libraries_get_path('example'), FALSE, 'libraries_get_path() returns FALSE for a missing library.');
  }

  /**
   * Tests libraries_prepare_files().
   */
  function testLibrariesPrepareFiles() {
    $expected = array(
      'files' => array(
        'js' => array('example.js' => array()),
        'css' => array('example.css' => array()),
        'php' => array('example.php' => array()),
      ),
    );
    $library = array(
      'files' => array(
        'js' => array('example.js'),
        'css' => array('example.css'),
        'php' => array('example.php'),
      ),
    );
    libraries_prepare_files($library, NULL, NULL);
    $this->assertEqual($expected, $library, 'libraries_prepare_files() works correctly.');
  }
}

/**
 * Tests basic detection and loading of libraries.
 */
class LibrariesTestCase extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Libraries detection and loading',
      'description' => 'Tests detection and loading of libraries.',
      'group' => 'Libraries API',
    );
  }

  function setUp() {
    parent::setUp('libraries', 'libraries_test_module');
    theme_enable(array('libraries_test_theme'));
  }

  /**
   * Tests libraries_detect_dependencies().
   */
  function testLibrariesDetectDependencies() {
    $library = array(
      'name' => 'Example',
      'dependencies' => array('example_missing'),
    );
    libraries_detect_dependencies($library);
    $this->assertEqual($library['error'], 'missing dependency', 'libraries_detect_dependencies() detects missing dependency');
    $error_message = t('The %dependency library, which the %library library depends on, is not installed.', array(
      '%dependency' => 'Example missing',
      '%library' => $library['name'],
    ));
    $this->verbose("Expected:<br>$error_message");
    $this->verbose('Actual:<br>' . $library['error message']);
    $this->assertEqual($library['error message'], $error_message, 'Correct error message for a missing dependency');
    // Test versioned dependencies.
    $version = '1.1';
    $compatible = array(
      '1.1',
      '<=1.1',
      '>=1.1',
      '<1.2',
      '<2.0',
      '>1.0',
      '>1.0-rc1',
      '>1.0-beta2',
      '>1.0-alpha3',
      '>0.1',
      '<1.2, >1.0',
      '>0.1, <=1.1',
    );
    $incompatible = array(
      '1.2',
      '2.0',
      '<1.1',
      '>1.1',
      '<=1.0',
      '<=1.0-rc1',
      '<=1.0-beta2',
      '<=1.0-alpha3',
      '>=1.2',
      '<1.1, >0.9',
      '>=0.1, <1.1',
    );
    $library = array(
      'name' => 'Example',
    );
    foreach ($compatible as $version_string) {
      $library['dependencies'][0] = "example_dependency ($version_string)";
      // libraries_detect_dependencies() is a post-detect callback, so
      // 'installed' is already set, when it is called. It sets the value to
      // FALSE for missing or incompatible dependencies.
      $library['installed'] = TRUE;
      libraries_detect_dependencies($library);
      $this->verbose('Library:<pre>' . var_export($library, TRUE) . '</pre>');
      $this->assertTrue($library['installed'], "libraries_detect_dependencies() detects compatible version string: '$version_string' is compatible with '$version'");
    }
    foreach ($incompatible as $version_string) {
      $library['dependencies'][0] = "example_dependency ($version_string)";
      $library['installed'] = TRUE;
      unset($library['error'], $library['error message']);
      libraries_detect_dependencies($library);
      $this->verbose('Library:<pre>' . var_export($library, TRUE) . '</pre>');
      $this->assertEqual($library['error'], 'incompatible dependency', "libraries_detect_dependencies() detects incompatible version strings: '$version_string' is incompatible with '$version'");
    }
    // Instead of repeating this assertion for each version string, we just
    // re-use the $library variable from the foreach loop.
    $error_message = t('The version %dependency_version of the %dependency library is not compatible with the %library library.', array(
      '%dependency_version' => $version,
      '%dependency' => 'Example dependency',
      '%library' => $library['name'],
    ));
    $this->verbose("Expected:<br>$error_message");
    $this->verbose('Actual:<br>' . $library['error message']);
    $this->assertEqual($library['error message'], $error_message, 'Correct error message for an incompatible dependency');
  }

  /**
   * Tests libraries_scan_info_files().
   */
  function testLibrariesScanInfoFiles() {
    $expected = array('example_info_file' => (object) array(
      'uri' => drupal_get_path('module', 'libraries') . '/tests/libraries/example_info_file.libraries.info',
      'filename' => 'example_info_file.libraries.info',
      'name' => 'example_info_file.libraries',
    ));
    $this->assertEqual(libraries_scan_info_files(), $expected, 'libraries_scan_info_files() correctly finds the example info file.');
    $this->verbose('<pre>' . var_export(libraries_scan_info_files(), TRUE) . '</pre>');
  }

  /**
   * Tests libraries_info().
   */
  function testLibrariesInfo() {
    // Test that modules can provide and alter library information.
    $info = libraries_info();
    $this->assertTrue(isset($info['example_module']));
    $this->verbose('Library:<pre>' . var_export($info['example_module'], TRUE) . '</pre>');
    $this->assertEqual($info['example_module']['info type'], 'module');
    $this->assertEqual($info['example_module']['module'], 'libraries_test_module');
    $this->assertTrue($info['example_module']['module_altered']);

    // Test that themes can provide and alter library information.
    $this->assertTrue(isset($info['example_theme']));
    $this->verbose('Library:<pre>' . var_export($info['example_theme'], TRUE) . '</pre>');
    $this->assertEqual($info['example_theme']['info type'], 'theme');
    $this->assertEqual($info['example_theme']['theme'], 'libraries_test_theme');
    $this->assertTrue($info['example_theme']['theme_altered']);

    // Test that library information is found correctly.
    $expected = array(
      'name' => 'Example files',
      'library path' => drupal_get_path('module', 'libraries') . '/tests/libraries/example',
      'version' => '1',
      'files' => array(
        'js' => array('example_1.js' => array()),
        'css' => array('example_1.css' => array()),
        'php' => array('example_1.php' => array()),
      ),
      'info type' => 'module',
      'module' => 'libraries_test_module',
    );
    libraries_info_defaults($expected, 'example_files');
    $library = libraries_info('example_files');
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Library information is correctly gathered.');

    // Test a library specified with an .info file gets detected.
    $expected = array(
      'name' => 'Example info file',
      'info type' => 'info file',
      'info file' => drupal_get_path('module', 'libraries') . '/tests/libraries/example_info_file.libraries.info',
    );
    libraries_info_defaults($expected, 'example_info_file');
    $library = libraries_info('example_info_file');
    // If this module was downloaded from Drupal.org, the Drupal.org packaging
    // system has corrupted the test info file.
    // @see http://drupal.org/node/1606606
    unset($library['core'], $library['datestamp'], $library['project'], $library['version']);
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Library specified with an .info file found');
  }

  /**
   * Tests libraries_detect().
   */
  function testLibrariesDetect() {
    // Test missing library.
    $library = libraries_detect('example_missing');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['error'], 'not found', 'Missing library not found.');
    $error_message = t('The %library library could not be found.', array(
      '%library' => $library['name'],
    ));
    $this->assertEqual($library['error message'], $error_message, 'Correct error message for a missing library.');

    // Test unknown library version.
    $library = libraries_detect('example_undetected_version');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['error'], 'not detected', 'Undetected version detected as such.');
    $error_message = t('The version of the %library library could not be detected.', array(
      '%library' => $library['name'],
    ));
    $this->assertEqual($library['error message'], $error_message, 'Correct error message for a library with an undetected version.');

    // Test unsupported library version.
    $library = libraries_detect('example_unsupported_version');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['error'], 'not supported', 'Unsupported version detected as such.');
    $error_message = t('The installed version %version of the %library library is not supported.', array(
      '%version' => $library['version'],
      '%library' => $library['name'],
    ));
    $this->assertEqual($library['error message'], $error_message, 'Correct error message for a library with an unsupported version.');

    // Test supported library version.
    $library = libraries_detect('example_supported_version');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['installed'], TRUE, 'Supported library version found.');

    // Test libraries_get_version().
    $library = libraries_detect('example_default_version_callback');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['version'], '1', 'Expected version returned by default version callback.');

    // Test a multiple-parameter version callback.
    $library = libraries_detect('example_multiple_parameter_version_callback');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['version'], '1', 'Expected version returned by multiple parameter version callback.');

    // Test a top-level files property.
    $library = libraries_detect('example_files');
    $files = array(
      'js' => array('example_1.js' => array()),
      'css' => array('example_1.css' => array()),
      'php' => array('example_1.php' => array()),
    );
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['files'], $files, 'Top-level files property works.');

    // Test version-specific library files.
    $library = libraries_detect('example_versions');
    $files = array(
      'js' => array('example_2.js' => array()),
      'css' => array('example_2.css' => array()),
      'php' => array('example_2.php' => array()),
    );
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['files'], $files, 'Version-specific library files found.');

    // Test missing variant.
    $library = libraries_detect('example_variant_missing');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['variants']['example_variant']['error'], 'not found', 'Missing variant not found');
    $error_message = t('The %variant variant of the %library library could not be found.', array(
      '%variant' => 'example_variant',
      '%library' => 'Example variant missing',
    ));
    $this->assertEqual($library['variants']['example_variant']['error message'], $error_message, 'Correct error message for a missing variant.');

    // Test existing variant.
    $library = libraries_detect('example_variant');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['variants']['example_variant']['installed'], TRUE, 'Existing variant found.');
  }

  /**
   * Tests libraries_load().
   */
  function testLibrariesLoad() {
    // Test dependencies.
    $library = libraries_load('example_dependency_missing');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertFalse($library['loaded'], 'Library with missing dependency cannot be loaded');
    $library = libraries_load('example_dependency_incompatible');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertFalse($library['loaded'], 'Library with incompatible dependency cannot be loaded');
    $library = libraries_load('example_dependency_compatible');
    $this->verbose('<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library['loaded'], 1, 'Library with compatible dependency is loaded');
    $loaded = &drupal_static('libraries_load');
    $this->verbose('<pre>' . var_export($loaded, TRUE) . '</pre>');
    $this->assertEqual($loaded['example_dependency']['loaded'], 1, 'Dependency library is also loaded');

    // Test that PHP files that have a local $path variable do not break library
    // loading.
    // @see _libraries_require_once()
    $library = libraries_load('example_path_variable_override');
    $this->assertEqual($library['loaded'], 2, 'PHP files cannot break library loading.');
  }

  /**
   * Tests the applying of callbacks.
   */
  function testCallbacks() {
    $expected = array(
      'name' => 'Example callback',
      'library path' => drupal_get_path('module', 'libraries') . '/tests/libraries/example',
      'version' => '1',
      'versions' => array(
        '1' => array(
          'variants' => array(
            'example_variant' => array(
              'info callback' => 'not applied',
              'pre-detect callback' => 'not applied',
              'post-detect callback' => 'not applied',
              'pre-dependencies-load callback' => 'not applied',
              'pre-load callback' => 'not applied',
              'post-load callback' => 'not applied',
            ),
          ),
          'info callback' => 'not applied',
          'pre-detect callback' => 'not applied',
          'post-detect callback' => 'not applied',
          'pre-dependencies-load callback' => 'not applied',
          'pre-load callback' => 'not applied',
          'post-load callback' => 'not applied',
        ),
      ),
      'variants' => array(
        'example_variant' => array(
          'info callback' => 'not applied',
          'pre-detect callback' => 'not applied',
          'post-detect callback' => 'not applied',
          'pre-dependencies-load callback' => 'not applied',
          'pre-load callback' => 'not applied',
          'post-load callback' => 'not applied',
        ),
      ),
      'callbacks' => array(
        'info' => array('_libraries_test_module_info_callback'),
        'pre-detect' => array('_libraries_test_module_pre_detect_callback'),
        'post-detect' => array('_libraries_test_module_post_detect_callback'),
        'pre-dependencies-load' => array('_libraries_test_module_pre_dependencies_load_callback'),
        'pre-load' => array('_libraries_test_module_pre_load_callback'),
        'post-load' => array('_libraries_test_module_post_load_callback'),
      ),
      'info callback' => 'not applied',
      'pre-detect callback' => 'not applied',
      'post-detect callback' => 'not applied',
      'pre-dependencies-load callback' => 'not applied',
      'pre-load callback' => 'not applied',
      'post-load callback' => 'not applied',
      'info type' => 'module',
      'module' => 'libraries_test_module',
    );
    libraries_info_defaults($expected, 'example_callback');

    // Test a callback in the 'info' group.
    $expected['info callback'] = 'applied (top-level)';
    $expected['versions']['1']['info callback'] = 'applied (version 1)';
    $expected['versions']['1']['variants']['example_variant']['info callback'] = 'applied (version 1, variant example_variant)';
    $expected['variants']['example_variant']['info callback'] = 'applied (variant example_variant)';
    $library = libraries_info('example_callback');
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Prepare callback was applied correctly.');

    // Test a callback in the 'pre-detect' and 'post-detect' phases.
    // Successfully detected libraries should only contain version information
    // for the detected version and thus, be marked as installed.
    unset($expected['versions']);
    $expected['installed'] = TRUE;
    // Additionally, version-specific properties of the detected version are
    // supposed to override the corresponding top-level properties.
    $expected['info callback'] = 'applied (version 1)';
    $expected['variants']['example_variant']['installed'] = TRUE;
    $expected['variants']['example_variant']['info callback'] = 'applied (version 1, variant example_variant)';
    // Version-overloading takes place after the 'pre-detect' callbacks have
    // been applied.
    $expected['pre-detect callback'] = 'applied (version 1)';
    $expected['post-detect callback'] = 'applied (top-level)';
    $expected['variants']['example_variant']['pre-detect callback'] = 'applied (version 1, variant example_variant)';
    $expected['variants']['example_variant']['post-detect callback'] = 'applied (variant example_variant)';
    $library = libraries_detect('example_callback');
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Detect callback was applied correctly.');

    // Test a callback in the 'pre-dependencies-load', 'pre-load' and
    // 'post-load' phases.
    // Successfully loaded libraries should only contain information about the
    // already loaded variant.
    unset($expected['variants']);
    $expected['loaded'] = 0;
    $expected['pre-dependencies-load callback'] = 'applied (top-level)';
    $expected['pre-load callback'] = 'applied (top-level)';
    $expected['post-load callback'] = 'applied (top-level)';
    $library = libraries_load('example_callback');
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Pre-load and post-load callbacks were applied correctly.');
    // This is not recommended usually and is only used for testing purposes.
    drupal_static_reset('libraries_load');
    // Successfully loaded library variants are supposed to contain the specific
    // variant information only.
    $expected['info callback'] = 'applied (version 1, variant example_variant)';
    $expected['pre-detect callback'] = 'applied (version 1, variant example_variant)';
    $expected['post-detect callback'] = 'applied (variant example_variant)';
    $library = libraries_load('example_callback', 'example_variant');
    $this->verbose('Expected:<pre>' . var_export($expected, TRUE) . '</pre>');
    $this->verbose('Actual:<pre>' . var_export($library, TRUE) . '</pre>');
    $this->assertEqual($library, $expected, 'Pre-detect and post-detect callbacks were applied correctly to a variant.');
  }

  /**
   * Tests that library files are properly added to the page output.
   *
   * We check for JavaScript and CSS files directly in the DOM and add a list of
   * included PHP files manually to the page output.
   *
   * @see _libraries_test_module_load()
   */
  function testLibrariesOutput() {
    // Test loading of a simple library with a top-level files property.
    $this->drupalGet('libraries-test-module/files');
    $this->assertLibraryFiles('example_1', 'File loading');

    // Test loading of integration files.
    $this->drupalGet('libraries-test-module/module-integration-files');
    $this->assertRaw('libraries_test_module.js', 'Integration file loading: libraries_test_module.js found');
    $this->assertRaw('libraries_test_module.css', 'Integration file loading: libraries_test_module.css found');
    $this->assertRaw('libraries_test_module.inc', 'Integration file loading: libraries_test_module.inc found');
    $this->drupalGet('libraries-test-module/theme-integration-files');
    $this->assertRaw('libraries_test_theme.js', 'Integration file loading: libraries_test_theme.js found');
    $this->assertRaw('libraries_test_theme.css', 'Integration file loading: libraries_test_theme.css found');
    $this->assertRaw('libraries_test_theme.inc', 'Integration file loading: libraries_test_theme.inc found');

    // Test loading of post-load integration files.
    $this->drupalGet('libraries-test-module/module-integration-files-post-load');
    // If the files were not loaded correctly, a fatal error occurs.
    $this->assertResponse(200, 'Post-load integration files are loaded correctly.');

    // Test version overloading.
    $this->drupalGet('libraries-test-module/versions');
    $this->assertLibraryFiles('example_2', 'Version overloading');

    // Test variant loading.
    $this->drupalGet('libraries-test-module/variant');
    $this->assertLibraryFiles('example_3', 'Variant loading');

    // Test version overloading and variant loading.
    $this->drupalGet('libraries-test-module/versions-and-variants');
    $this->assertLibraryFiles('example_4', 'Concurrent version and variant overloading');

    // Test caching.
    variable_set('libraries_test_module_cache', TRUE);
    cache_clear_all('example_callback', 'cache_libraries');
    // When the library information is not cached, all callback groups should be
    // invoked.
    $this->drupalGet('libraries-test-module/cache');
    $this->assertRaw('The <em>info</em> callback group was invoked.', 'Info callback invoked for uncached libraries.');
    $this->assertRaw('The <em>pre-detect</em> callback group was invoked.', 'Pre-detect callback invoked for uncached libraries.');
    $this->assertRaw('The <em>post-detect</em> callback group was invoked.', 'Post-detect callback invoked for uncached libraries.');
    $this->assertRaw('The <em>pre-load</em> callback group was invoked.', 'Pre-load callback invoked for uncached libraries.');
    $this->assertRaw('The <em>post-load</em> callback group was invoked.', 'Post-load callback invoked for uncached libraries.');
    // When the library information is cached only the 'pre-load' and
    // 'post-load' callback groups should be invoked.
    $this->drupalGet('libraries-test-module/cache');
    $this->assertNoRaw('The <em>info</em> callback group was not invoked.', 'Info callback not invoked for cached libraries.');
    $this->assertNoRaw('The <em>pre-detect</em> callback group was not invoked.', 'Pre-detect callback not invoked for cached libraries.');
    $this->assertNoRaw('The <em>post-detect</em> callback group was not invoked.', 'Post-detect callback not invoked for cached libraries.');
    $this->assertRaw('The <em>pre-load</em> callback group was invoked.', 'Pre-load callback invoked for cached libraries.');
    $this->assertRaw('The <em>post-load</em> callback group was invoked.', 'Post-load callback invoked for cached libraries.');
    variable_set('libraries_test_module_cache', FALSE);
  }

  /**
   * Helper function to assert that a library was correctly loaded.
   *
   * Asserts that all the correct files were loaded and all the incorrect ones
   * were not.
   *
   * @param $name
   *   The name of the files that should be loaded. The current testing system
   *   knows of 'example_1', 'example_2', 'example_3' and 'example_4'. Each name
   *   has an associated JavaScript, CSS and PHP file that will be asserted. All
   *   other files will be asserted to not be loaded. See
   *   tests/example/README.txt for more information on how the loading of the
   *   files is tested.
   * @param $label
   *   (optional) A label to prepend to the assertion messages, to make them
   *   less ambiguous.
   * @param $extensions
   *   (optional) The expected file extensions of $name. Defaults to
   *   array('js', 'css', 'php').
   */
  function assertLibraryFiles($name, $label = '', $extensions = array('js', 'css', 'php')) {
    $label = ($label !== '' ? "$label: " : '');

    // Test that the wrong files are not loaded...
    $names = array(
      'example_1' => FALSE,
      'example_2' => FALSE,
      'example_3' => FALSE,
      'example_4' => FALSE,
    );
    // ...and the correct ones are.
    $names[$name] = TRUE;

    // Test for the specific HTML that the different file types appear as in the
    // DOM.
    $html = array(
      'js' => array('<script type="text/javascript" src="', '"></script>'),
      'css' => array('@import url("', '");'),
      // PHP files do not get added to the DOM directly.
      // @see _libraries_test_load()
      'php' => array('<li>', '</li>'),
    );

    foreach ($names as $name => $expected) {
      foreach ($extensions as $extension) {
        $filepath = drupal_get_path('module', 'libraries') . "/tests/libraries/example/$name.$extension";
        // JavaScript and CSS files appear as full URLs and with an appended
        // query string.
        if (in_array($extension, array('js', 'css'))) {
          $filepath = url('', array('absolute' => TRUE)) . $filepath . '?' . variable_get('css_js_query_string');
        }
        $raw = $html[$extension][0] . $filepath . $html[$extension][1];
        if ($expected) {
          $this->assertRaw($raw, "$label$name.$extension found.");
        }
        else {
          $this->assertNoRaw($raw, "$label$name.$extension not found.");
        }
      }
    }
  }

}