public string Format(ChordClass chordClass) { string pitchClassString = chordClass.PitchClass.PitchClass switch { PitchClass a when a.Equals(PitchClass.A) => "A", PitchClass b when b.Equals(PitchClass.B) => "B", PitchClass c when c.Equals(PitchClass.C) => "C", PitchClass d when d.Equals(PitchClass.D) => "D", PitchClass e when e.Equals(PitchClass.E) => "E", PitchClass f when f.Equals(PitchClass.F) => "F", PitchClass g when g.Equals(PitchClass.G) => "G", _ => throw new InvalidOperationException() }; string accidentalString = chordClass.PitchClass.Accidental switch { Accidental flat when flat.Equals(Accidental.Flat) => "b", Accidental sharp when sharp.Equals(Accidental.Sharp) => "#", Accidental natural when natural.Equals(Accidental.Natural) => string.Empty, _ => throw new InvalidOperationException() }; string patternString = chordClass switch { ChordClass major when major.Pattern.Equals(TriadPattern.Major) => string.Empty, ChordClass minor when minor.Pattern.Equals(TriadPattern.Minor) => "m", ChordClass sus2 when sus2.Pattern.Equals(TriadPattern.SuspendedSecond) => "sus2", ChordClass sus4 when sus4.Pattern.Equals(TriadPattern.SuspendedFourth) => "sus4", _ => throw new InvalidOperationException() }; return($"{pitchClassString}{accidentalString}{patternString}"); } } }
public void Format_WithSuspendedSecondChordNoAdditionalTones_ShouldReturnPitchClassInUpperCaseWithAccidental(PitchClass pitchClass, Accidental accidental, string expectedValue) { // ARRANGE var westernChordStringFormatter = new WesternChordStringFormatter(); var chordClass = new ChordClass(new PitchClassWithAccidental(pitchClass, accidental), TriadPattern.SuspendedSecond, ImmutableList <ChordAddedNote> .Empty); // ACT string actualValue = westernChordStringFormatter.Format(chordClass); // ASSERT actualValue.Should().Be(expectedValue); }
public void Format_WithUnknownTriadPattern_ShouldThrowInvalidOperationException() { // ARRANGE var pitchClass = PitchClass.A; var accidental = Accidental.Natural; var triadPattern = (TriadPattern)typeof(TriadPattern).GetConstructors(BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic) .First(c => c.GetParameters().FirstOrDefault()?.ParameterType == typeof(int)) .Invoke(new object[] { -3 }); var westernChordStringFormatter = new WesternChordStringFormatter(); var chordClass = new ChordClass(new PitchClassWithAccidental(pitchClass, accidental), triadPattern, ImmutableList <ChordAddedNote> .Empty); // ACT Action format = () => westernChordStringFormatter.Format(chordClass); // ASSERT format.Should().ThrowExactly <InvalidOperationException>(); }