// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.google.dart.compiler;

import com.google.dart.compiler.SystemLibrariesReader.DartLibrary;

import junit.framework.TestCase;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Map;
import java.util.Map.Entry;

/**
 * Test the {@link SystemLibrariesReader}
 */
public class SystemLibrariesReaderTest extends TestCase {

  
  public void testLibrariesFileExists(){
    File sdkLibPath = new File(PackageLibraryManager.DEFAULT_SDK_PATH, "lib");
    File librariesFile = new File(new File(sdkLibPath, SystemLibrariesReader.INTERNAL_DIR), SystemLibrariesReader.LIBRARIES_FILE);
    assertTrue(librariesFile.exists());
  }
  
  public void testLibrariesFileContent() throws URISyntaxException, IOException{
    File sdkLibPath = new File(PackageLibraryManager.DEFAULT_SDK_PATH, "lib");
    URI base = sdkLibPath.toURI();
    SystemLibrariesReader reader = new SystemLibrariesReader(sdkLibPath);
    Map<String, DartLibrary> librariesMap = reader.getLibrariesMap();
    assertTrue(!librariesMap.isEmpty());
    for (Entry<String, DartLibrary> entry : librariesMap.entrySet()) {
      if (entry.getValue().getCategory().equals("Internal")){
        continue;
      }
      String path = entry.getValue().getPath();
      File file = new File(base.resolve(new URI(null, null, path, null, null)).normalize());
      if (!file.exists()) {
        fail("Expected " + entry.getKey() + " path in libraries.dart to exist in SDK"
            + "\n  could not find " + file);
      }
    }
  }
  
}
