| // 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. |
| |
| /** Tests for [PathMapper]. */ |
| library path_info_test; |
| |
| import 'package:path/path.dart' as path; |
| import 'package:polymer/src/info.dart'; |
| import 'package:polymer/src/paths.dart'; |
| import 'package:polymer/src/utils.dart' as utils; |
| import 'package:unittest/compact_vm_config.dart'; |
| import 'package:unittest/unittest.dart'; |
| |
| main() { |
| useCompactVMConfiguration(); |
| group('paths', () { |
| setUp(() { |
| utils.path = new path.Builder(style: path.Style.posix); |
| }); |
| |
| tearDown(() { |
| utils.path = new path.Builder(); |
| }); |
| |
| testPaths(); |
| }); |
| } |
| |
| testPaths() { |
| group('outdir == basedir:', () { |
| group('outputPath', () { |
| test('mangle automatic', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file = _mockFile('a/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'a/_b.dart.dart'); |
| }); |
| |
| test('within packages/', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file = _mockFile('a/packages/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'a/_from_packages/_b.dart.dart'); |
| }); |
| }); |
| |
| group('importUrlFor', () { |
| test('simple pathMapper', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/e/f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), 'e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), '../e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart'); |
| }); |
| |
| test('include packages/', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/packages/f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| '_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| '../_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart'); |
| }); |
| |
| test('packages, but no rewrite', () { |
| var pathMapper = _newPathMapper('a', 'a', false, rewriteUrls: false); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/packages/c/f.dart', pathMapper, |
| url: 'package:e/f.dart'); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| 'package:e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| 'package:e/_f.dart.dart'); |
| }); |
| |
| test('windows paths', () { |
| try { |
| utils.path = new path.Builder(style: path.Style.windows); |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file1 = _mockFile('a\\b.dart', pathMapper); |
| var file2 = _mockFile('a\\c\\d.dart', pathMapper); |
| var file3 = _mockFile('a\\packages\\f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| '_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| '../_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart'); |
| } finally { |
| utils.path = new path.Builder(); |
| } |
| }); |
| }); |
| |
| test('transformUrl simple paths', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file1 = 'a/b.dart'; |
| var file2 = 'a/c/d.html'; |
| // when the output == input directory, no paths should be rewritten |
| expect(pathMapper.transformUrl(file1, '/a.dart'), '/a.dart'); |
| expect(pathMapper.transformUrl(file1, 'c.dart'), 'c.dart'); |
| expect(pathMapper.transformUrl(file1, '../c/d.dart'), '../c/d.dart'); |
| expect(pathMapper.transformUrl(file1, 'packages/c.dart'), |
| 'packages/c.dart'); |
| expect(pathMapper.transformUrl(file2, 'e.css'), 'e.css'); |
| expect(pathMapper.transformUrl(file2, '../c/e.css'), 'e.css'); |
| expect(pathMapper.transformUrl(file2, '../q/e.css'), '../q/e.css'); |
| expect(pathMapper.transformUrl(file2, 'packages/c.css'), |
| 'packages/c.css'); |
| expect(pathMapper.transformUrl(file2, '../packages/c.css'), |
| '../packages/c.css'); |
| }); |
| |
| test('transformUrl with source in packages/', () { |
| var pathMapper = _newPathMapper('a', 'a', false); |
| var file = 'a/packages/e.html'; |
| // Even when output == base, files under packages/ are moved to |
| // _from_packages, so all imports are affected: |
| expect(pathMapper.transformUrl(file, 'e.css'), '../packages/e.css'); |
| expect(pathMapper.transformUrl(file, '../packages/e.css'), |
| '../packages/e.css'); |
| expect(pathMapper.transformUrl(file, '../q/e.css'), '../q/e.css'); |
| expect(pathMapper.transformUrl(file, 'packages/c.css'), |
| '../packages/packages/c.css'); |
| }); |
| }); |
| |
| group('outdir != basedir:', () { |
| group('outputPath', (){ |
| test('no force mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file = _mockFile('a/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'out/b.dart'); |
| }); |
| |
| test('force mangling', () { |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file = _mockFile('a/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'out/_b.dart.dart'); |
| }); |
| |
| test('within packages/, no mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file = _mockFile('a/packages/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'out/_from_packages/b.dart'); |
| }); |
| |
| test('within packages/, mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file = _mockFile('a/packages/b.dart', pathMapper); |
| expect(file.dartCodeUrl.resolvedPath, 'a/packages/b.dart'); |
| expect(pathMapper.outputPath(file.dartCodeUrl.resolvedPath, '.dart'), |
| 'out/_from_packages/_b.dart.dart'); |
| }); |
| }); |
| |
| group('importUrlFor', (){ |
| test('simple paths, no mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/e/f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/d.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), 'e/f.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../b.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), '../e/f.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/d.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../b.dart'); |
| }); |
| |
| test('simple paths, mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/e/f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), 'e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), '../e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart'); |
| }); |
| |
| test('include packages/, no mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/packages/e/f.dart', pathMapper, |
| url: 'package:e/f.dart'); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/d.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| '_from_packages/e/f.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../b.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| '../_from_packages/e/f.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../../c/d.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../../b.dart'); |
| }); |
| |
| test('include packages/, mangle', () { |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file1 = _mockFile('a/b.dart', pathMapper); |
| var file2 = _mockFile('a/c/d.dart', pathMapper); |
| var file3 = _mockFile('a/packages/e/f.dart', pathMapper, |
| url: 'package:e/f.dart'); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| '_from_packages/e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| '../_from_packages/e/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../../_b.dart.dart'); |
| }); |
| |
| test('windows paths', () { |
| try { |
| utils.path = new path.Builder(style: path.Style.windows); |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file1 = _mockFile('a\\b.dart', pathMapper); |
| var file2 = _mockFile('a\\c\\d.dart', pathMapper); |
| var file3 = _mockFile('a\\packages\\f.dart', pathMapper); |
| expect(pathMapper.importUrlFor(file1, file2), 'c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file1, file3), |
| '_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file1), '../_b.dart.dart'); |
| expect(pathMapper.importUrlFor(file2, file3), |
| '../_from_packages/_f.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file2), '../c/_d.dart.dart'); |
| expect(pathMapper.importUrlFor(file3, file1), '../_b.dart.dart'); |
| } finally { |
| utils.path = new path.Builder(); |
| } |
| }); |
| }); |
| |
| group('transformUrl', () { |
| test('simple source, not in packages/', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file1 = 'a/b.dart'; |
| var file2 = 'a/c/d.html'; |
| // when the output == input directory, no paths should be rewritten |
| expect(pathMapper.transformUrl(file1, '/a.dart'), '/a.dart'); |
| expect(pathMapper.transformUrl(file1, 'c.dart'), '../a/c.dart'); |
| |
| // reach out from basedir: |
| expect(pathMapper.transformUrl(file1, '../c/d.dart'), '../c/d.dart'); |
| |
| // reach into packages dir: |
| expect(pathMapper.transformUrl(file1, 'packages/c.dart'), |
| '../a/packages/c.dart'); |
| |
| expect(pathMapper.transformUrl(file2, 'e.css'), '../../a/c/e.css'); |
| |
| _checkPath('../../a/c/../c/e.css', '../../a/c/e.css'); |
| expect(pathMapper.transformUrl(file2, '../c/e.css'), '../../a/c/e.css'); |
| |
| _checkPath('../../a/c/../q/e.css', '../../a/q/e.css'); |
| expect(pathMapper.transformUrl(file2, '../q/e.css'), '../../a/q/e.css'); |
| |
| expect(pathMapper.transformUrl(file2, 'packages/c.css'), |
| '../../a/c/packages/c.css'); |
| _checkPath('../../a/c/../packages/c.css', '../../a/packages/c.css'); |
| expect(pathMapper.transformUrl(file2, '../packages/c.css'), |
| '../../a/packages/c.css'); |
| }); |
| |
| test('input in packages/', () { |
| var pathMapper = _newPathMapper('a', 'out', true); |
| var file = 'a/packages/e.html'; |
| expect(pathMapper.transformUrl(file, 'e.css'), |
| '../../a/packages/e.css'); |
| expect(pathMapper.transformUrl(file, '../packages/e.css'), |
| '../../a/packages/e.css'); |
| expect(pathMapper.transformUrl(file, '../q/e.css'), '../../a/q/e.css'); |
| expect(pathMapper.transformUrl(file, 'packages/c.css'), |
| '../../a/packages/packages/c.css'); |
| }); |
| |
| test('src fragments', () { |
| var pathMapper = _newPathMapper('a', 'out', false); |
| var file1 = 'a/b.dart'; |
| var file2 = 'a/c/html.html'; |
| // when the output == input directory, no paths should be rewritten |
| expect(pathMapper.transformUrl(file1, '#tips'), '#tips'); |
| expect(pathMapper.transformUrl(file1, |
| 'http://www.w3schools.com/html_links.htm#tips'), |
| 'http://www.w3schools.com/html_links.htm#tips'); |
| expect(pathMapper.transformUrl(file2, |
| 'html_links.html'), |
| '../../a/c/html_links.html'); |
| expect(pathMapper.transformUrl(file2, |
| 'html_links.html#tips'), |
| '../../a/c/html_links.html#tips'); |
| }); |
| }); |
| }); |
| } |
| |
| _newPathMapper(String baseDir, String outDir, bool forceMangle, |
| {bool rewriteUrls: true}) => |
| new PathMapper(baseDir, outDir, 'packages', forceMangle, rewriteUrls); |
| |
| _mockFile(String filePath, PathMapper pathMapper, {String url}) { |
| var file = new FileInfo(new UrlInfo( |
| url == null ? filePath : url, filePath, null)); |
| file.outputFilename = pathMapper.mangle( |
| utils.path.basename(filePath), '.dart', false); |
| return file; |
| } |
| |
| _checkPath(String filePath, String expected) { |
| expect(utils.path.normalize(filePath), expected); |
| } |