@@ -125,6 +125,43 @@ public void CanResolveRefsByName()
125125 }
126126 }
127127
128+ [ Test ]
129+ public void CanUpdateTargetOnReference ( )
130+ {
131+ const string masterRef = "refs/heads/master" ;
132+ using ( var path = new TemporaryCloneOfTestRepo ( ) )
133+ using ( var repo = new Repository ( path . RepositoryPath ) )
134+ {
135+ var sha = repo . Refs [ "refs/heads/test" ] . ResolveToDirectReference ( ) . Target . Sha ;
136+ var master = repo . Refs [ masterRef ] ;
137+ master . ResolveToDirectReference ( ) . Target . Sha . ShouldNotEqual ( sha ) ;
138+
139+ repo . Refs . UpdateTarget ( masterRef , sha ) ;
140+
141+ master = repo . Refs [ masterRef ] ;
142+ master . ResolveToDirectReference ( ) . Target . Sha . ShouldEqual ( sha ) ;
143+ }
144+ }
145+
146+ [ Test ]
147+ public void CanUpdateTargetOnSymolicReference ( )
148+ {
149+ const string name = "refs/heads/unit_test" ;
150+ using ( var path = new TemporaryCloneOfTestRepo ( ) )
151+ using ( var repo = new Repository ( path . RepositoryPath ) )
152+ {
153+ var newRef = ( SymbolicReference ) repo . Refs . Create ( name , "refs/heads/master" ) ;
154+ newRef . ShouldNotBeNull ( ) ;
155+
156+ repo . Refs . UpdateTarget ( newRef . CanonicalName , "refs/heads/test" ) ;
157+
158+ newRef = ( SymbolicReference ) repo . Refs [ newRef . CanonicalName ] ;
159+ newRef . ResolveToDirectReference ( ) . Target . ShouldEqual ( repo . Refs [ "refs/heads/test" ] . ResolveToDirectReference ( ) . Target ) ;
160+
161+ repo . Refs . Delete ( newRef . CanonicalName ) ;
162+ }
163+ }
164+
128165 [ Test ]
129166 public void CreateWithEmptyStringForTargetThrows ( )
130167 {
@@ -200,5 +237,46 @@ public void ResolvingWithNullThrows()
200237 Assert . Throws < ArgumentNullException > ( ( ) => { var head = repo . Refs [ null ] ; } ) ;
201238 }
202239 }
240+
241+ [ Test ]
242+ public void TryingToUpdateADirectRefWithSymbolFails ( )
243+ {
244+ const string name = "refs/heads/unit_test" ;
245+ using ( var path = new TemporaryCloneOfTestRepo ( ) )
246+ using ( var repo = new Repository ( path . RepositoryPath ) )
247+ {
248+ var newRef = ( SymbolicReference ) repo . Refs . Create ( name , "refs/heads/master" ) ;
249+ newRef . ShouldNotBeNull ( ) ;
250+
251+ Assert . Throws < ArgumentException > (
252+ ( ) => repo . Refs . UpdateTarget ( newRef . CanonicalName , repo . Refs [ "refs/heads/test" ] . ResolveToDirectReference ( ) . Target . Sha ) ) ;
253+
254+ repo . Refs . Delete ( newRef . CanonicalName ) ;
255+ }
256+ }
257+
258+ [ Test ]
259+ public void TryingToUpdateASymbolicRefWithOidFails ( )
260+ {
261+ const string masterRef = "refs/heads/master" ;
262+ using ( var path = new TemporaryCloneOfTestRepo ( ) )
263+ using ( var repo = new Repository ( path . RepositoryPath ) )
264+ {
265+ Assert . Throws < ArgumentException > ( ( ) => repo . Refs . UpdateTarget ( masterRef , "refs/heads/test" ) ) ;
266+ }
267+ }
268+
269+ [ Test ]
270+ public void UpdateReferenceTargetWithBadParametersFails ( )
271+ {
272+ using ( var path = new TemporaryCloneOfTestRepo ( ) )
273+ using ( var repo = new Repository ( path . RepositoryPath ) )
274+ {
275+ Assert . Throws < ArgumentException > ( ( ) => repo . Refs . UpdateTarget ( string . Empty , "refs/heads/packed" ) ) ;
276+ Assert . Throws < ArgumentException > ( ( ) => repo . Refs . UpdateTarget ( "master" , string . Empty ) ) ;
277+ Assert . Throws < ArgumentNullException > ( ( ) => repo . Refs . UpdateTarget ( null , "refs/heads/packed" ) ) ;
278+ Assert . Throws < ArgumentNullException > ( ( ) => repo . Refs . UpdateTarget ( "master" , null ) ) ;
279+ }
280+ }
203281 }
204282}
0 commit comments