test('Migrate Storage (empty => multi root)', () => {
		const workspaceToMigrateFrom = URI.from({ path: '1500007676869', scheme: 'empty' }).toString();
		createService(workspaceToMigrateFrom);

		const workspaceToMigrateTo = URI.from({ path: '2500007676869', scheme: 'root' }).toString();

		migrateStorageToMultiRootWorkspace(workspaceToMigrateFrom, { id: '2500007676869', configPath: null }, storage);

		const s2 = new StorageLegacyService(storage, storage, workspaceToMigrateTo);
		const parsed = parseStorage(storage);

		assert.equal(parsed.empty.size, 1);
		assert.equal(parsed.folder.size, 0);
		assert.equal(parsed.multiRoot.size, 1);

		const migratedStorage = parsed.multiRoot.get(workspaceToMigrateTo);
		assert.equal(Object.keys(migratedStorage).length, 4);
		assert.equal(migratedStorage['key1'], s2.get('key1', StorageLegacyScope.WORKSPACE));
		assert.equal(migratedStorage['key2.something'], s2.get('key2.something', StorageLegacyScope.WORKSPACE));
		assert.equal(migratedStorage['key3/special'], s2.get('key3/special', StorageLegacyScope.WORKSPACE));
		assert.equal(migratedStorage['key4 space'], s2.get('key4 space', StorageLegacyScope.WORKSPACE));
	});
	function createService(workspaceId?: string): StorageLegacyService {
		const service = new StorageLegacyService(storage, storage, workspaceId, workspaceId && startsWith(workspaceId, 'file:') ? Date.now() : void 0);

		// Unrelated
		storage.setItem('foo', 'bar');
		storage.setItem('storage://foo', 'bar');
		storage.setItem('storage://global/storage://foo', 'bar');

		// Global
		service.store('key1', 'value1');
		service.store('key2.something', JSON.stringify({ foo: 'bar' }));
		service.store('key3/special', true);
		service.store('key4 space', 4);

		// Workspace
		service.store('key1', 'value1', StorageLegacyScope.WORKSPACE);
		service.store('key2.something', JSON.stringify({ foo: 'bar' }), StorageLegacyScope.WORKSPACE);
		service.store('key3/special', true, StorageLegacyScope.WORKSPACE);
		service.store('key4 space', 4, StorageLegacyScope.WORKSPACE);

		return service;
	}
	test('Parse Storage (handle subfolders properly)', () => {
		const ws1 = URI.file('/some/folder/folder1').toString();
		const ws2 = URI.file('/some/folder/folder1/sub1').toString();

		const s1 = new StorageLegacyService(storage, storage, ws1, Date.now());
		const s2 = new StorageLegacyService(storage, storage, ws2, Date.now());

		s1.store('s1key1', 'value1', StorageLegacyScope.WORKSPACE);
		s1.store('s1key2.something', JSON.stringify({ foo: 'bar' }), StorageLegacyScope.WORKSPACE);
		s1.store('s1key3/special', true, StorageLegacyScope.WORKSPACE);
		s1.store('s1key4 space', 4, StorageLegacyScope.WORKSPACE);

		s2.store('s2key1', 'value1', StorageLegacyScope.WORKSPACE);
		s2.store('s2key2.something', JSON.stringify({ foo: 'bar' }), StorageLegacyScope.WORKSPACE);
		s2.store('s2key3/special', true, StorageLegacyScope.WORKSPACE);
		s2.store('s2key4 space', 4, StorageLegacyScope.WORKSPACE);

		const parsed = parseStorage(storage);

		const s1Storage = parsed.folder.get(ws1);
		assert.equal(Object.keys(s1Storage).length, 5);
		assert.equal(s1Storage['s1key1'], s1.get('s1key1', StorageLegacyScope.WORKSPACE));
		assert.equal(s1Storage['s1key2.something'], s1.get('s1key2.something', StorageLegacyScope.WORKSPACE));
		assert.equal(s1Storage['s1key3/special'], s1.get('s1key3/special', StorageLegacyScope.WORKSPACE));
		assert.equal(s1Storage['s1key4 space'], s1.get('s1key4 space', StorageLegacyScope.WORKSPACE));

		const s2Storage = parsed.folder.get(ws2);
		assert.equal(Object.keys(s2Storage).length, 5);
		assert.equal(s2Storage['s2key1'], s2.get('s2key1', StorageLegacyScope.WORKSPACE));
		assert.equal(s2Storage['s2key2.something'], s2.get('s2key2.something', StorageLegacyScope.WORKSPACE));
		assert.equal(s2Storage['s2key3/special'], s2.get('s2key3/special', StorageLegacyScope.WORKSPACE));
		assert.equal(s2Storage['s2key4 space'], s2.get('s2key4 space', StorageLegacyScope.WORKSPACE));
	});