/**
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.waveprotocol.wave.model.wave.data.impl;
import junit.framework.TestCase;
import org.waveprotocol.wave.model.document.operation.DocInitialization;
import org.waveprotocol.wave.model.document.operation.DocOp;
import org.waveprotocol.wave.model.document.operation.DocOp;
import org.waveprotocol.wave.model.id.WaveId;
import org.waveprotocol.wave.model.id.WaveletId;
import org.waveprotocol.wave.model.id.WaveletName;
import org.waveprotocol.wave.model.operation.OpComparators;
import org.waveprotocol.wave.model.operation.OperationException;
import org.waveprotocol.wave.model.schema.SchemaCollection;
import org.waveprotocol.wave.model.testing.ModelTestUtils;
import org.waveprotocol.wave.model.util.CollectionUtils;
import org.waveprotocol.wave.model.version.HashedVersion;
import org.waveprotocol.wave.model.wave.ParticipantId;
import org.waveprotocol.wave.model.wave.data.BlipData;
import org.waveprotocol.wave.model.wave.data.ObservableWaveletData;
import org.waveprotocol.wave.model.wave.data.WaveletData;
import org.waveprotocol.wave.model.wave.data.core.CoreWaveletData;
import org.waveprotocol.wave.model.wave.data.core.impl.CoreWaveletDataImpl;
import java.util.HashMap;
import java.util.Map;
/**
*/
public class DataUtilTest extends TestCase {
/**
* Creates map of sequentially generated docIds (beginning with prefix + "0")
* to the given documents contents.
*/
private static Map<String, DocOp> createDocuments(String documentNamePrefix,
DocOp... contents) {
Map<String, DocOp> docs = new HashMap<String, DocOp>();
int i = 0;
for (DocOp c : contents) {
docs.put(documentNamePrefix + i, c);
i++;
}
return docs;
}
/**
* Creates a CoreWaveletData with the given name, documents, and participants.
*/
private static CoreWaveletData createCoreWaveletData(WaveletName name,
Map<String, DocOp> documents, ParticipantId... participants)
throws OperationException {
CoreWaveletDataImpl data = new CoreWaveletDataImpl(name.waveId, name.waveletId);
for (ParticipantId p : participants) {
data.addParticipant(p);
}
for (Map.Entry<String, DocOp> d : documents.entrySet()) {
data.modifyDocument(d.getKey(), d.getValue());
}
return data;
}
private static void assertOpEquals(DocOp expected, DocOp actual) {
assertTrue(OpComparators.SYNTACTIC_IDENTITY.equal(expected, actual));
}
private static final WaveletName WAVELET_NAME =
WaveletName.of(WaveId.of("example.com", "wave"), WaveletId.of("example.com", "wavelet"));
private static final DocInitialization[] CONTENTS = new DocInitialization[]{
ModelTestUtils.createContent("the quick brown fox"),
ModelTestUtils.createContent("nothing to fear but fear itself"),
ModelTestUtils.createContent("these are not the droids you are looking for")
};
private static final ParticipantId BOB = new ParticipantId("bob@example.com");
private static final ParticipantId JOE = new ParticipantId("joe@example.com");
private static final ParticipantId LIZ = new ParticipantId("liz@example.com");
HashedVersion VERSION = HashedVersion.of(42L, new byte[] {1, 2, 3, 4});
public void testFromCoreWaveletData() throws Exception {
Map<String, DocOp> docs = createDocuments("b+", CONTENTS);
CoreWaveletData core = createCoreWaveletData(WAVELET_NAME, docs, BOB, JOE);
// sanity checks
assertEquals(WAVELET_NAME, core.getWaveletName());
assertEquals(CONTENTS.length, core.getDocuments().size());
assertOpEquals(CONTENTS[0], core.getDocuments().get("b+0"));
assertEquals(CollectionUtils.newArrayList(BOB, JOE), core.getParticipants());
ObservableWaveletData obs =
DataUtil.fromCoreWaveletData(core, VERSION, SchemaCollection.empty());
assertEquals(BOB, obs.getCreator());
assertEquals(0L, obs.getCreationTime());
assertEquals(0L, obs.getLastModifiedTime());
assertEquals(VERSION, obs.getHashedVersion());
assertEquals(VERSION.getVersion(), obs.getVersion());
assertEquals(WAVELET_NAME.waveId, obs.getWaveId());
assertEquals(WAVELET_NAME.waveletId, obs.getWaveletId());
assertEquals(CollectionUtils.immutableSet(BOB, JOE), obs.getParticipants());
assertEquals(docs.keySet(), obs.getDocumentIds());
for (Map.Entry<String, DocOp> d : docs.entrySet()) {
BlipData blip = obs.getDocument(d.getKey());
WaveletData wavelet = blip.getWavelet();
assertEquals(WAVELET_NAME.waveId, wavelet.getWaveId());
assertEquals(WAVELET_NAME.waveletId, wavelet.getWaveletId());
assertEquals(d.getKey(), blip.getId());
assertNotNull(blip.getAuthor());
assertEquals(0L, blip.getLastModifiedTime());
assertEquals(-1, blip.getLastModifiedVersion());
assertTrue(blip.getContributors().isEmpty());
assertOpEquals(d.getValue(), blip.getContent().asOperation());
try {
blip.addContributor(JOE);
fail("blips from DataUtil.fromCoreWaveletData() are immutable");
} catch (UnsupportedOperationException expected) {
}
}
try {
obs.addParticipant(LIZ);
fail("wavelets from DataUtil.fromCoreWaveletData() are immutable");
} catch (UnsupportedOperationException expected) {
}
// test that changes to core are reflected in data
core.addParticipant(LIZ);
assertEquals(CollectionUtils.newArrayList(BOB, JOE, LIZ), core.getParticipants());
assertEquals(CollectionUtils.immutableSet(BOB, JOE, LIZ), obs.getParticipants());
}
}