private static AssertionTracker As <TSubject>( [ValidatedNotNull] this TSubject value, string name, AssertionKind assertionKind) { if (value is AssertionTracker tracker) { tracker.ThrowImproperUseOfFrameworkIfDetected(AssertionTrackerShould.NotExist); } var result = value.BuildTrackerFromAnonymousObject(name, assertionKind) ?? new AssertionTracker { SubjectValue = value, SubjectName = name, SubjectType = typeof(TSubject), Actions = Actions.Categorized, AssertionKind = assertionKind, }; if (name != null) { result.Actions |= Actions.Named; } return(result); }
private static AssertionTracker BuildTrackerFromAnonymousObject <TSubject>( [ValidatedNotNull] this TSubject value, string name = null, AssertionKind assertionKind = AssertionKind.Unknown) { var subjectType = typeof(TSubject); AssertionTracker result = null; if (!ReferenceEquals(value, null)) { if (subjectType.IsClosedAnonymousTypeFastCheck()) { // with one property? that's the subject we are trying to apply verification to. var properties = subjectType.GetProperties(); if (properties.Length == 1) { result = new AssertionTracker { SubjectValue = properties[0].GetValue(value, null), SubjectName = name ?? properties[0].Name, SubjectType = properties[0].PropertyType, AssertionKind = assertionKind, }; if (assertionKind != AssertionKind.Unknown) { result.Actions |= Actions.Categorized; } if (result.SubjectName != null) { result.Actions |= Actions.Named; } } else { var errorMessage = string.Format(CultureInfo.InvariantCulture, Verifications.AnonymousObjectDoesNotHaveSinglePropertyErrorMessage, properties.Length, string.Join(", ", properties.Select(_ => _.Name).ToArray())); ThrowImproperUseOfFramework(errorMessage); } } } return(result); }