Index: ruby/branches/0.5/spec/lib/open_ehr/rm/common/change_control/versioned_object_spec.rb
===================================================================
--- ruby/branches/0.5/spec/lib/open_ehr/rm/common/change_control/versioned_object_spec.rb	(revision 335)
+++ ruby/branches/0.5/spec/lib/open_ehr/rm/common/change_control/versioned_object_spec.rb	(revision 335)
@@ -0,0 +1,232 @@
+require File.dirname(__FILE__) + '/../../../../../spec_helper'
+require File.dirname(__FILE__) + '/shared_examples_spec'
+include OpenEHR::RM::Common::ChangeControl
+include OpenEHR::RM::Common::Generic
+include OpenEHR::RM::DataTypes::Quantity::DateTime
+
+describe VersionedObject do
+  before(:each) do
+    uid1 = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    defining_code1 = stub(CodePhrase, :code_string => '532')
+    lifecycle_state1 = stub(DvCodedText, :defining_code => defining_code1)
+    time_committed1 = DvDateTime.new(:value => '2008-11-12T18:24:32')
+    audit_details1 = stub(AuditDetails, :time_committed => time_committed1)
+    version1 = stub(Version, :commit_audit => audit_details1,
+                             :lifecycle_state => lifecycle_state1,
+                             :uid => uid1)
+    uid2 = ObjectVersionID.new(:value => 'GHI::JKL::2')
+    defining_code2 = stub(CodePhrase, :code_string => '553')
+    lifecycle_state2 = stub(DvCodedText, :defining_code => defining_code2)
+    time_committed2 = DvDateTime.new(:value => '2008-12-12T19:32:14')
+    audit_details2 = stub(AuditDetails, :time_committed => time_committed2)
+    attestation = stub(Attestation)
+    attestations = Array.new([attestation])
+    contribution = stub(ObjectRef, :empty? => false, :type => 'CONTRIBUTION')
+    version2 = OriginalVersion.new(:commit_audit => audit_details2,
+                                   :lifecycle_state => lifecycle_state2,
+                                   :preceding_version_uid => uid1,
+                                   :uid => uid2,
+                                   :contribution => contribution,
+                                   :attestations => attestations)
+    uid3 = ObjectVersionID.new(:value => 'MNO::PQR::3')
+    defining_code3 = stub(CodePhrase, :code_string => '523')
+    lifecycle_state3 = stub(DvCodedText, :defining_code => defining_code3)
+    time_committed3 = DvDateTime.new(:value => '2009-07-15T09:24:26')
+    audit_details3 = stub(AuditDetails, :time_committed => time_committed3)
+    version3 = stub(Version, :commit_audit => audit_details3,
+                             :lifecycle_state => lifecycle_state3,
+                             :uid => uid3)
+    uid = HierObjectID.new(:value => 'STU::VWX::5')
+    owner_id = stub(ObjectRef, :namespace => 'test')
+    time_created = DvDateTime.new(:value => '2009-11-09T09:53:22')
+    object_id = stub(ObjectID, :value => 'unique')
+    all_versions = [version1, version2, version3]
+    @versioned_object = VersionedObject.new(:uid => uid,
+                                            :owner_id => owner_id,
+                                            :time_created => time_created,
+                                            :all_versions => all_versions)
+  end
+
+  it 'should be an instance of VersionedObject' do
+    @versioned_object.should be_an_instance_of VersionedObject
+  end
+
+  it 'uid value should be STU::VWX::5' do
+    @versioned_object.uid.value.should == 'STU::VWX::5'
+  end
+
+  it 'owner_id namespace should be test' do
+    @versioned_object.owner_id.namespace.should == 'test'
+  end
+
+  it 'all_versions.size should be 3' do
+    @versioned_object.all_versions.size.should == 3
+  end
+
+  it 'version_count should be 3' do
+    @versioned_object.version_count.should == 3
+  end
+
+  it 'time_created should equal 2009-11-09T09:53:22' do
+    @versioned_object.time_created.value.should == '2009-11-09T09:53:22'
+  end
+
+  it 'all_version_ids should return all ids of versions' do
+    ids = @versioned_object.all_version_ids
+    ids.each do |id|
+      %w(ABC::DEF::1 GHI::JKL::2 MNO::PQR::3).should include id.value
+    end
+  end
+
+  it 'should have version id ABC::DEF::1' do
+    object_version_id = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    @versioned_object.has_version_id?(object_version_id).should be_true
+  end
+
+  it 'should not have version id BCD::EFG::12' do
+    object_version_id = ObjectVersionID.new(:value => 'BCD::EFG::12')
+    @versioned_object.has_version_id?(object_version_id).should be_false
+  end
+
+  it 'ABC::DEF::1 should not be original version' do
+    object_version_id = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    @versioned_object.is_original_version?(object_version_id).should be_false
+  end
+
+  it 'GHI::JKL::2 should be original version' do
+    object_version_id = ObjectVersionID.new(:value => 'GHI::JKL::2')
+    @versioned_object.is_original_version?(object_version_id).should be_true
+  end
+
+  it 'should have 2009-07-15T09:24:26 committed version' do
+    exist_time = DvDateTime.new(:value => '2009-07-15T09:24:26')
+    @versioned_object.has_version_at_time?(exist_time).should be_true
+  end
+
+  it 'should retrun version3 with id MNO::PQR::3' do
+    uid = ObjectVersionID.new(:value => 'MNO::PQR::3')
+    @versioned_object.version_with_id(uid).commit_audit.time_committed.
+      should == DvDateTime.new(:value => '2009-07-15T09:24:26')
+  end
+
+  it 'should return version2 with 2008-12-12T19:32:14' do
+    exist_date = DvDateTime.new(:value => '2008-12-12T19:32:14')
+    @versioned_object.version_at_time(exist_date).lifecycle_state.
+      defining_code.code_string.should == '553'
+  end
+
+  it 'latest_version should return version3' do
+    @versioned_object.latest_version.uid.value.should == 'MNO::PQR::3'
+  end
+
+  it 'latest_trunk_version should return ABC::DEF::1' do
+    @versioned_object.latest_trunk_version.uid.value.should ==
+      'ABC::DEF::1'
+  end
+
+  it 'trunk_lifecycle_state should return 532' do
+    @versioned_object.trunk_lifecycle_state.defining_code.
+      code_string.should == '532'
+  end
+
+  it 'revision_history items are 3' do
+    @versioned_object.revision_history.items.size.should == 3
+  end
+
+  it 'should be able to commit original version' do
+    contribution = stub(ObjectRef, :empty? => false, :type => 'CONTRIBUTION')
+    uid = ObjectVersionID.new(:value => 'EFG::HIJ::7')
+    preceding_version_uid = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    audit = stub(AuditDetails)
+    defining_code = stub(CodePhrase, :code_string => '523')
+    lifecycle_state = stub(DvCodedText, :defining_code => defining_code)
+    attestations = stub(Array, :empty? => false)
+    @versioned_object.
+      commit_original_version(:contribution => contribution,
+                              :uid => uid,
+                              :preceding_version_uid => preceding_version_uid,
+                              :commit_audit => audit,
+                              :lifecycle_state => lifecycle_state,
+                              :data => 'data',
+                              :attestations => attestations,
+                              :signature => 'A41bdad')
+    @versioned_object.all_versions.size.should == 4
+  end
+
+  it 'should raise ArgumentError with invalid preceeding version' do
+    contribution = stub(ObjectRef, :empty? => false, :type => 'CONTRIBUTION')
+    uid = ObjectVersionID.new(:value => 'EFG::HIJ::7')
+    preceding_version_uid = ObjectVersionID.new(:value => 'BCD::EFG::8')
+    audit = stub(AuditDetails)
+    defining_code = stub(CodePhrase, :code_string => '523')
+    lifecycle_state = stub(DvCodedText, :defining_code => defining_code)
+    attestations = stub(Array, :empty? => false)
+    lambda {
+      @versioned_object.
+      commit_original_version(:contribution => contribution,
+                              :uid => uid,
+                              :preceding_version_uid => preceding_version_uid,
+                              :commit_audit => audit,
+                              :lifecycle_state => lifecycle_state,
+                              :data => 'data',
+                              :attestations => attestations,
+                              :signature => 'A41bdad')
+    }.should raise_error ArgumentError
+  end
+
+  it 'should be able to commit original merged version' do
+    contribution = stub(ObjectRef, :empty? => false, :type => 'CONTRIBUTION')
+    uid = ObjectVersionID.new(:value => 'KLM::NOP::9')
+    preceding_version_uid = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    time_committed = DvDateTime.new(:value => '2009-11-09T23:42:18')
+    audit = stub(AuditDetails, :time_committed => time_committed)
+    defining_code = stub(CodePhrase, :code_string => '523')
+    lifecycle_state = stub(DvCodedText, :defining_code => defining_code)
+    attestations = stub(Array, :empty? => false)
+    @versioned_object.
+      commit_original_version(:contribution => contribution,
+                              :uid => uid,
+                              :preceding_version_uid => preceding_version_uid,
+                              :commit_audit => audit,
+                              :lifecycle_state => lifecycle_state,
+                              :data => 'merged data',
+                              :attestations => attestations,
+                              :signature => 'dc3dbdad')
+    @versioned_object.latest_version.data.should == 'merged data'
+  end
+
+  it 'should be able to commit imported_version' do
+    contribution = stub(ObjectRef, :empty? => false, :type => 'CONTRIBUTION')
+    time_committed = DvDateTime.new(:value => '2009-11-09T23:42:18')
+    audit = stub(AuditDetails, :time_committed => time_committed)
+    uid = ObjectVersionID.new(:value => 'QRS::TUV::10')
+    preceding_version_uid = ObjectVersionID.new(:value => 'ABC::DEF::1')
+    defining_code = stub(CodePhrase, :code_string => '523')
+    lifecycle_state = stub(DvCodedText, :defining_code => defining_code)
+    attestations = stub(Array, :empty? => false)
+    original_version = OriginalVersion.new(:uid => uid,
+                            :contribution => contribution,
+                            :commit_audit => audit,
+                            :preceding_version_uid => preceding_version_uid,
+                            :data => 'original data',
+                            :lifecycle_state => lifecycle_state,
+                            :attestations => attestations)
+    @versioned_object.commit_imported_version(:contribution => contribution,
+                                              :commit_audit => audit,
+                                              :item => original_version)
+    @versioned_object.latest_version.commit_audit.time_committed.value.
+      should == '2009-11-09T23:42:18'
+  end
+
+  it 'should be able to commit attestation' do
+    attestation = stub(Attestation)
+    uid = ObjectVersionID.new(:value => 'GHI::JKL::2')
+    @versioned_object.commit_attestation(:attestation => attestation,
+                                         :uid => uid,
+                                         :signature => 'CDAEbad')
+    @versioned_object.version_with_id(uid).signature.
+      should == 'CDAEbad'
+  end
+end
+
+
Index: ruby/branches/0.5/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_date_time_spec.rb
===================================================================
--- ruby/branches/0.5/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_date_time_spec.rb	(revision 334)
+++ ruby/branches/0.5/spec/lib/open_ehr/rm/data_types/quantity/date_time/dv_date_time_spec.rb	(revision 335)
@@ -14,3 +14,7 @@
     @dv_date_time.magnitude.should be_close 63423697018.3, 0.001
   end
+
+  it 'should be equal when magnitude is same' do
+    @dv_date_time.should == DvDateTime.new(:value => '2009-09-29T15:03:22.3')
+  end
 end
