Create a gist now

Instantly share code, notes, and snippets.

Embed
describe('sakuraCrowd.jsonId.refToObj', function() {
it("参照オブジェクトを参照先オブジェクトに変換する", function() {
var target = [
{"id":"id1", "value":10},
{"$ref":"id1"}
];
sakuraCrowd.jsonId.refToObj(target);
expect(target.length).toEqual(2);
expect(target[0]).toBe(target[1]);
});
it("循環参照を検出したら該当する JsonPath を返して警告する", function() {
var target = [
{"id":"id1", "value":10, "other":{"$ref":"id2"}},
{"id":"id2", "other":{"$ref":"id1"}}
];
var path = "$[0].other.other";
expect(sakuraCrowd.jsonId.refToObj.bind(null, target)).toThrow("循環参照です。" + path);
});
});
describe('sakuraCrowd.jsonId.objToRef', function() {
it("参照可能オブジェクトを参照オブジェクトに変換する(infoあり)", function() {
var target = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var target2 = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var expectedInfo = {
"root":target,
"table":{
"id1":"$[1]"
}
};
info = sakuraCrowd.jsonId.refToObj(target);
sakuraCrowd.jsonId.objToRef(target, info);
expect(target).toEqual(target2);
expect(info.table).toEqual(expectedInfo.table);
expect(info.root).toBe(expectedInfo.root);
});
it("参照可能オブジェクトを参照オブジェクトに変換する(infoなし)", function() {
// 参照オブジェクトにするときに、 ID に対応した JSONPath の情報がなければ、
// 最初に見つけた参照可能オブジェクトを定義として残します。それ以降は、参照オブジェクトに置換します。
var target = [
{"$ref":"id1"},
{"id":"id1", "value":10}
];
var target2 = [
{"id":"id1", "value":10},
{"$ref":"id1"}
];
info = sakuraCrowd.jsonId.refToObj(target);
sakuraCrowd.jsonId.objToRef(target);
expect(target).toEqual(target2);
});
});
@sakura-crowd

This comment has been minimized.

Show comment
Hide comment
@sakura-crowd

sakura-crowd Jul 10, 2014

先日は、参照を実際のオブジェクトに置き換えるだけでした。
今回はさらに、 ID を持つオブジェクトが2回以上出た場合に参照に置き換える機能を追加しました。
参照から実際のオブジェクトに置き換えるときに、どこが実際のオブジェクトの定義なのかを記録することで、
あとでオブジェクトから参照に戻すときに、オブジェクトを定義する場所を再現することもできます。
この情報がない場合は、最初に見つけたオブジェクトの場所に定義をして、他はその参照に置き換えます。
この情報は、 refToObj の引数の target の値を root として持ちます。
ID プロパティを持つオブジェクトの target をルートとした JSONPath の絶対パスを ID をキーとして持ちます。

Owner

sakura-crowd commented Jul 10, 2014

先日は、参照を実際のオブジェクトに置き換えるだけでした。
今回はさらに、 ID を持つオブジェクトが2回以上出た場合に参照に置き換える機能を追加しました。
参照から実際のオブジェクトに置き換えるときに、どこが実際のオブジェクトの定義なのかを記録することで、
あとでオブジェクトから参照に戻すときに、オブジェクトを定義する場所を再現することもできます。
この情報がない場合は、最初に見つけたオブジェクトの場所に定義をして、他はその参照に置き換えます。
この情報は、 refToObj の引数の target の値を root として持ちます。
ID プロパティを持つオブジェクトの target をルートとした JSONPath の絶対パスを ID をキーとして持ちます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment