
    rh                   |   S r SSKJr  SSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr   " S S\R@                  5      r!\"S:X  a  SSKr\RF                  " \!5        gg)z$
Tests for :mod:`music21.mei.base`.
    )annotationsN)ElementTree)defaultdict)Fraction)mock)articulations)bar)clefduration)
instrument)interval)key)metadata)meter)note)pitch)spanner)stream)tie)base)_XMLID)MEI_NSc            	      8(   \ rS rSrS rS rS rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S	5      \R                  " S
5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       5       5       r
S rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS  r\R                  " S!5      S" 5       r\R                  " S#5      S$ 5       rS% r S& r!S' r"\R                  " S(5      \R                  " S)5      \R                  " S*5      S+ 5       5       5       r#\R                  " S(5      \R                  " S)5      \R                  " S*5      S, 5       5       5       r$S- r%S. r&S/ r'S0 r(S1 r)S2 r*S3 r+S4 r,S5 r-\R                  " S65      S7 5       r.S8 r/S9 r0S: r1S; r2\R                  " S<5      S= 5       r3\R                  " S<5      S> 5       r4\R                  " S<5      S? 5       r5\R                  " S<5      S@ 5       r6\R                  " S<5      SA 5       r7\R                  " S<5      SB 5       r8\R                  " S<5      SC 5       r9\R                  " SD5      SE 5       r:\R                  " SD5      SF 5       r;\R                  " SD5      SG 5       r<SH r=SI r>SJ r?SK r@SL rASM rBSN rCSO rDSP rESQ rFSR rGSS rHST rISU rJSV rKSW rLSX rMSY rN\R                  " S65      SZ 5       rO\R                  " S65      S[ 5       rP\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      S` 5       5       5       5       rQSa rRSb rS\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      \R                  " Sc5      Sd 5       5       5       5       5       rTSe rU\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      \R                  " S!5      \R                  " Sf5      \R                  " Sg5      Sh 5       5       5       5       5       5       5       rVSi rW\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      \R                  " Sj5      \R                  " Sk5      Sl 5       5       5       5       5       5       rXSm rY\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      \R                  " Sn5      So 5       5       5       5       5       rZSp r[\R                  " S\5      \R                  " S]5      \R                  " S^5      \R                  " S_5      \R                  " Sq5      Sr 5       5       5       5       5       r\Ss r]\R                  " St5      \R                  " S_5      \R                  " Sj5      Su 5       5       5       r^Sv r_Sw r`Sx ra\R                  " Sy5      Sz 5       rb\R                  " Sy5      S{ 5       rc\R                  " S|5      S} 5       rd\R                  " S|5      S~ 5       re\fS 5       rg\R                  " S5      \R                  " S]5      \R                  " S_5      \R                  " S5      S 5       5       5       5       rhS ri\R                  " S5      \R                  " S]5      \R                  " S_5      \R                  " S5      S 5       5       5       5       rjS rk\R                  " S5      \R                  " S]5      \R                  " S_5      \R                  " S5      \R                  " S!5      \R                  " Sf5      \R                  " Sg5      S 5       5       5       5       5       5       5       rlS rm\R                  " S5      \R                  " S]5      \R                  " S_5      \R                  " S5      \R                  " Sj5      S 5       5       5       5       5       rnS ro\R                  " S5      \R                  " S]5      \R                  " S_5      \R                  " S5      \R                  " Sn5      S 5       5       5       5       5       rpS rq\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rr\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rs\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rtS ruS rvS rw\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rx\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       ry\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rz\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       r{S r|S r}S r~\R                  " S5      S 5       rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       rS rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       5       rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       5       5       rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       5       5       rS r\R                  " S5      S 5       rS rS r\R                  " S5      \R                  " S5      S 5       5       rS r\R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       rS rS rS r\R                  " S65      S 5       rS rS rS r\R                  " S5      S 5       rS rS rS rS rS rS rS rS rS r\R                  " S65      S 5       r\R                  " S5      S 5       r\R                  " S5      \R                  " S65      S 5       5       rS rS r\R                  " S65      S 5       rS r\R                  " S65      S 5       rS rS rS r\R                  " S5      S 5       r\R                  " S5      S 5       r\R                  " S5      S 5       r\R                  " S5      S 5       rS r\R                  " S]5      \R                  " Sj5      \R                  " S5      S 5       5       5       r\R                  " S]5      \R                  " Sj5      \R                  " S5      S 5       5       5       r\R                  " S]5      \R                  " Sj5      \R                  " S5      S 5       5       5       rS rS rS rS r\R                  " S5      S 5       r\R                  " S5      S 5       r\R                  " S5      S 5       r\R                  " S5      S 5       rS rS rS rS rS rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       rS r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      S 5       5       5       5       5       r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      \R                  " S65      S 5       5       5       5       5       rS r\R                  " S5      S 5       r\R                  " S5      \R                  " S5      \R                  " S5      \R                  " S5      GS  5       5       5       5       rGS r\R                  " GS5      \R                  " GS5      \R                  " GS5      \R                  " S5      GS 5       5       5       5       rGS r\R                  " GS5      \R                  " GS5      \R                  " GS5      \R                  " S5      GS 5       5       5       5       rGS r\R                  " GS5      \R                  " GS5      \R                  " GS5      \R                  " S5      GS	 5       5       5       5       rGS
 r\R                  " S65      \R                  " GS5      \R                  " GS5      \R                  " GS5      \R                  " S5      GS 5       5       5       5       5       r\R                  " S65      GS 5       rGS rGS rGS r GS rGS rGSrGg(  Test:   c                    [         R                  " 5       nU R                  UR                  5        U R	                  UR
                  [        5        U R	                  UR                  [        R                  5        g)zE
__init__(): no argument gives an "empty" MeiToM21Converter instance
N)
r   MeiToM21ConverterassertIsNotNonedocumentRootassertIsInstancem21Attrr   
slurBundler   SpannerBundle)selfactuals     O/home/james-whalen/.local/lib/python3.13/site-packages/music21/mei/test_base.py	testInit1Test.testInit1>   sV     '')V001fnnk:f//1F1FG    c                X   Sn[         R                  " U5      nU R                  UR                  5        U R	                  [
         S3UR                  R                  5        U R                  UR                  [        5        U R                  UR                  [        R                  5        g)z3
__init__(): a valid MEI file is prepared properly
z<?xml version="1.0" encoding="UTF-8"?>
                       <mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="2013">
                       <music><score></score></music></mei>meiN)r   r   r   r    assertEqualr   tagr!   r"   r   r#   r   r$   )r%   	inputFiler&   s      r'   	testInit2Test.testInit2G   s    ?	 ''	2 	V001F83)<)<)@)@Afnnk:f//1F1FGr*   c                0   SnU R                  [        R                  [        R                  U5         [        R                  " U5        g! [        R                   a7  nU R	                  [        R
                  UR                  S   5         SnAgSnAff = f)z<
__init__(): an invalid XML file causes an MeiValidityError
zthis is not an XML filer   N)assertRaisesr   MeiValidityErrorr   r-   _INVALID_XML_DOCargsr%   r/   theErrors      r'   	testInit3Test.testInit3W   su     .	$//1G1GS	F""9-$$ 	FT22HMM!4DEE	Fs   A
 
B-BBc                N   SnU R                  [        R                  [        R                  U5         [        R                  " U5        g! [        R                   aF  nU R	                  [        R
                  R                  S5      UR                  S   5         SnAgSnAff = f)z7
__init__(): a MusicXML file causes an MeiElementError
a(  <?xml version="1.0" encoding="UTF-8"?>
                       <!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 3.1 Partwise//EN"
                                                       "http://www.musicxml.org/dtds/partwise.dtd">
                       <score-partwise></score-partwise>zscore-partwiser   N)r3   r   MeiElementErrorr   r-   _WRONG_ROOT_ELEMENTformatr6   r7   s      r'   	testInit4Test.testInit4b   s    <	 	$..0F0F	R	b""9-## 	bT55<<=MNPXP]P]^_P`aa	bs   A
 
B$<BB$zmusic21.mei.base._ppSlurszmusic21.mei.base._ppTieszmusic21.mei.base._ppBeamszmusic21.mei.base._ppTupletszmusic21.mei.base._ppConcludez!music21.mei.base.scoreFromElementzmusic21.mei.base.makeMetadatac                   [         R                  " 5       n[        R                  " [        R
                  S9Ul        SUR                  R                  l        [        R                  " [        R                  S9n	Xl        S[         S[         S3n
UR                  5       nU R                  X5        UR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  U5        UR                  R                  R                  U
5        UR                  SUR                  5        UR                  UR                  5        g)z(
MeiToM21Converter.run(): that it works
spec_set   .//music//scoreN)r   r   r   	MagicMockETreeElementr    findreturn_valuer   Streamr   runassertIsassert_called_once_withr#   )r%   mockMetamockScoreFEmockConclude
mockTuplet	mockBeamsmockTies	mockSlurstestConvexpScoreexpDocRootQueryr&   s               r'   testRun1Test.testRun1p   s    ))+ $ F23""/>>6==9#+ xwvhe<h'**84))(3((2))(3,,X6""::?K++Ax/B/BC(()>)>?r*   c                D   Sn[         R                  " S5      n[        R                  " U5      nU R	                  UR
                  UR
                  5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)z2
safePitch(): when ``name`` is a valid pitch name
D#6Nr   Pitchr   	safePitchr-   name
accidentaloctaver%   rb   expectedr&   s       r'   testSafePitch1Test.testSafePitch1   sq     ;;u%%4,,f.?.?@&--8r*   c                B   Sn[         R                  " 5       n[        R                  " U5      nU R	                  UR
                  UR
                  5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)z6
safePitch(): when ``name`` is not a valid pitch name
 Nr_   re   s       r'   testSafePitch2Test.testSafePitch2   sn     ;;=%4,,f.?.?@&--8r*   c                @   [         R                  " S5      n[        R                  " SSSS9nU R	                  UR
                  UR
                  5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)zK
safePitch(): when ``name`` is not given, but there are various **keywords
r^   D#6rb   rc   rd   Nr_   r%   rf   r&   s      r'   testSafePitch3Test.testSafePitch3   sp     ;;u%SSE4,,f.?.?@&--8r*   c                @   [         R                  " S5      n[        R                  " SSSS9nU R	                  UR
                  UR
                  5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)z(
safePitch(): when 2nd argument is None
D6rn   Nrp   rq   r_   rr   s      r'   testSafePitch4Test.testSafePitch4   sp     ;;t$ST#F4,,f.?.?@&--8r*   c                L   [         R                  " [        R                  S9/n[         R                  " SS9US   l        [         R                  " [        R                  S9n[         R                  " US9Ul        S/n[        R                  " U5      nU R                  X45        g)z/
allPartsPresent(): one <staffDef>, no repeats
rB   1rL   r   N)	r   rH   rI   rJ   getfindallr   allPartsPresentassertSequenceEqual)r%   	staffDefselemrf   r&   s        r'   testAllPartsPresent1Test.testAllPartsPresent1   su     ^^U]];<	>>s;	!~~u}}5~~9=5%%d+  2r*   c                   [        S5       Vs/ s H%  n[        R                  " [        R                  S9PM'     nn[        S5       H*  n[        R                  " [        US-   5      S9X#   l        M,     [        R                  " [        R                  S9n[        R                  " US9Ul        [        S5      n[        R                  " U5      nU R                  XV5        gs  snf )z%
allPartsPresent(): four <staffDef>s
   rB      r{   1234Nranger   rH   rI   rJ   strr|   r}   listr   r~   r   r%   _r   ir   rf   r&   s          r'   testAllPartsPresent2Test.testAllPartsPresent2   s     FK1XNXT^^U]];X	NqA#~~3q1u:FIL ~~u}}5~~9=<%%d+  2 Os   ,C#c                   [        S5       Vs/ s H%  n[        R                  " [        R                  S9PM'     nn[        S5       H-  n[        R                  " [        US-  S-   5      S9X#   l        M/     [        R                  " [        R                  S9n[        R                  " US9Ul        [        S5      n[        R                  " U5      nU R                  XV5        gs  snf )z=
allPartsPresent(): four unique <staffDef>s, several repeats
   rB   r   r   r{   r   Nr   r   s          r'   testAllPartsPresent3Test.testAllPartsPresent3   s     FK2YOYT^^U]];Y	OrA#~~3A{;KLIL ~~u}}5~~9=<%%d+  2 Ps   ,C&c                p   [         R                  " [        R                  S9nU R	                  [
        R                  [
        R                  U5         [
        R                  " U5        g! [
        R                   a7  nU R                  [
        R                  UR                  S   5         SnAgSnAff = f)z*
allPartsPresent(): error: no <staffDef>s
rB   r   N)r   rH   rI   rJ   r3   r   r4   r~   r-   _SEEMINGLY_NO_PARTSr6   )r%   r   mvErrs      r'   testAllPartsPresent4Test.testAllPartsPresent4   s     ~~u}}5$//1E1EtL	F  &$$ 	FT55uzz!}EE	Fs   A* *B5>-B00B5c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  X#R
                  5        g)z7
_timeSigFromAttrs(): that it works (integration test)
{mei}staffDef38meter.count
meter.unitattrib3/8N)rI   rJ   r   _timeSigFromAttrsr-   ratioString)r%   r   expectedRatioStringr&   s       r'   testTimeSigFromAttrsTest.testTimeSigFromAttrs   sE     }}_SX[5\]#''-,.@.@Ar*   c                    [         R                  " SSSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)	zT
_keySigFromAttrs(): using @key.pname, @key.accid, and @key.mode (integration test)
r   Bfminor)	key.pnamez	key.accidkey.moder   zb-N)	rI   rJ   r   _keySigFromAttrsr!   r   Keyr-   tonicPitchNameWithCase)r%   r   expectedTPNWCr&   s       r'   testKeySigFromAttrs1Test.testKeySigFromAttrs1   s`     }}_3UXBI6K L&&t,fcgg.(E(EFr*   c                   [         R                  " SSSS.S9nSnSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X$R                  5        U R                  X4R                  5        g)zF
_keySigFromAttrs(): using @key.sig, and @key.mode (integration test)
r   6sr   )key.sigr   r      N)
rI   rJ   r   r   r!   r   KeySignaturer-   sharpsmode)r%   r   expectedSharpsexpectedModer&   s        r'   testKeySigFromAttrs2Test.testKeySigFromAttrs2  sn     }}_SZ5[\&&t,fc&6&677{{3r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zH
_transpositionFromAttrs(): descending transposition (integration test)
r   -3-2
trans.semi
trans.diatr   m-3N	rI   rJ   r   _transpositionFromAttrsr!   r   Intervalr-   directedNamer%   r   expectedNamer&   s       r'   testTranspositionFromAttrs1 Test.testTranspositionFromAttrs1  Y     }}_DX\5]^--d3fh&7&78':':;r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zG
_transpositionFromAttrs(): ascending transposition (integration test)
r   74r   r   P5Nr   r   s       r'   testTranspositionFromAttrs2 Test.testTranspositionFromAttrs2  sY     }}_CWZ5[\--d3fh&7&78':':;r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zH
_transpositionFromAttrs(): large ascending interval (integration test)
r   1911r   r   P12Nr   r   s       r'   testTranspositionFromAttrs3 Test.testTranspositionFromAttrs3"  r   r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zE
_transpositionFromAttrs(): alternate octave spec (integration test)
r   120r   r   P8Nr   r   s       r'   testTranspositionFromAttrs4 Test.testTranspositionFromAttrs4,  sY     }}_DX[5\]--d3fh&7&78':':;r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zS
_transpositionFromAttrs(): alternate large descending interval (integration test)
r   z-19z-4r   r   zP-12Nr   r   s       r'   testTranspositionFromAttrs5 Test.testTranspositionFromAttrs56  sY     }}_EY]5^_--d3fh&7&78':':;r*   c                    [         R                  " SSSS.S9nSn[        R                  " U5      nU R	                  U[
        R                  5        U R                  X#R                  5        g)zV
_transpositionFromAttrs(): alternate ascending sixteenth interval (integration test)
r   26rz   r   r   M16Nr   r   s       r'   testTranspositionFromAttrs6 Test.testTranspositionFromAttrs6@  sY     }}_DX[5\]--d3fh&7&78':':;r*   c                Z    SnSn[         R                  " U5      nU R                  X#5        g)z0
removeOctothorpe(): when there's an octothorpe
z%#14ccdc11-8090-49f4-b094-5935f534131az$14ccdc11-8090-49f4-b094-5935f534131aNr   removeOctothorper-   r%   xmlidrf   r&   s       r'   testRemoveOctothorpe1Test.testRemoveOctothorpe1J  s,     89&&u-*r*   c                Z    SnSn[         R                  " U5      nU R                  X#5        g)z4
removeOctothorpe(): when there's not an octothorpe
z$b05c3007-bc49-4bc2-a970-bb5700cb634dNr   r   s       r'   testRemoveOctothorpe2Test.testRemoveOctothorpe2S  s,     79&&u-*r*   zmusic21.mei.base._makeArticListc                    [         R                  " SSS0S9nSUl        [        R                  " U5      nU R                  SU5        UR                  S5        g)z0
articFromElement(): very straight-forward test
articyesr   rD   N)rI   rJ   rL   r   articFromElementr-   rP   )r%   mockMakeListr   r&   s       r'   testArticFromElementTest.testArticFromElement\  sO    
 }}Wgu-=>$%!&&t,F#,,U3r*   z$music21.mei.base._accidentalFromAttrc                    [         R                  " SSS0S9nSUl        [        R                  " U5      nU R                  SU5        UR                  S5        g)z0
accidFromElement(): very straight-forward test
accidr   r   rD   N)rI   rJ   rL   r   accidFromElementr-   rP   )r%   	mockAccidr   r&   s       r'   testAccidFromElementTest.testAccidFromElementg  sO    
 }}Wgu-=>!"	&&t,F#))%0r*   c                    [         R                  " 5       nSUl        SU[         R                  " 5       [         R                  " 5       S/nSn[
        R                  " U5      nU R                  X45        g)z
getVoiceId(): usual case
*   N  )r   VoiceidrM   Partr   
getVoiceIdr-   )r%   theVoice	fromTheserf   r&   s        r'   testGetVoiceId1Test.testGetVoiceId1r  sS     <<>8V]]_fkkmSI	+*r*   c                    S[         R                  " 5       [         R                  " 5       S/nU R                  [        [
        R                  U5        g)z4
getVoiceId(): no Voice objects causes RuntimeError
Nr  )r   rM   r  r3   RuntimeErrorr   r  )r%   r	  s     r'   testGetVoiceId2Test.testGetVoiceId2}  s4     6==?FKKM3?	,Cr*   c                   [         R                  " 5       nSUl        [         R                  " 5       nSUl        SU[         R                  " 5       [         R                  " 5       US/nU R                  [        [        R                  U5        g)z7
getVoiceId(): three Voice objects causes RuntimeError
r     Nr  )	r   r  r  rM   r  r3   r  r   r  )r%   
firstVoice
otherVoicer	  s       r'   testGetVoiceId3Test.testGetVoiceId3  s]     \\^

\\^

:v}}zSVW	,Cr*   zmusic21.mei.base.metaSetTitlez music21.mei.base.metaSetComposerzmusic21.mei.base.metaSetDatec                   [         R                  " [        R                  S9nSUR                  l        [        R                  " U5      nU R                  U[        R                  5        UR                  R                  S[         S35        U R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  5        g)z1
makeMetadata() when there is no <work> element.
rB   NrE   workr   )r   rH   rI   rJ   rK   rL   r   makeMetadatar!   r   MetadatarP   r   r-   
call_count)r%   mockDatemockComposer	mockTitler    r&   s         r'   testMakeMeta1Test.testMakeMeta1  s     ~~u}}=)-&""<0fh&7&7811Cxt2DEH//0L334I001r*   c                   [         R                  " [        R                  S9n[         R                  " [        R                  S9nXTR                  l        S Ul        S Ul        S Ul        [        R                  " U5      nU R                  U[        R                  5        UR                  R                  S[         S35        UR                  XV5        UR                  XV5        UR                  XV5        g)z0
makeMetadata() when there is a <work> element.
rB   c                    U$ N unusedys     r'   <lambda>$Test.testMakeMeta2.<locals>.<lambda>  s    r*   c                    U$ r"  r#  r$  s     r'   r'  r(    s    Qr*   c                    U$ r"  r#  r$  s     r'   r'  r(    s    !r*   rE   r  N)r   rH   rI   rJ   rK   rL   side_effectr   r  r!   r   r  rP   r   )r%   r  r  r  r    mockWorkr&   s          r'   testMakeMeta2Test.testMakeMeta2  s     ~~u}}=>>5==9)1&2#6  3	""<0fh&7&7811Cxt2DE((:,,X>))(;r*   c                V   Sn[         R                  " U5      nSnSn[        R                  " 5       n[        R
                  " X5      nU R                  XE5        U R                  [        US5      5        U R                  X%R                  5        U R                  X5R                  5        g)z7
metaSetTitle() with a title and tempo but no subtitle
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <title>Symphony No. 7</title>
            </titleStmt>
            <tempo>Adagio</tempo>
        </work>zSymphony No. 7AdagiosubtitleN)rI   
fromstringr   r  r   metaSetTitlerO   assertFalsehasattrr-   titlemovementName)r%   r  expTitleexpMovementNamemetar&   s         r'   testMetaTitle1Test.testMetaTitle1  s     %#"  """4.d#z23<<0*=*=>r*   c                R   Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  [        US5      5        U R                  X$R                  5        U R                  UR                  5        g)z5
metaSetTitle() with a title, subtitle, but no tempo
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <title>Symphony No. 7</title>
                <title type="subtitle">in one movement</title>
            </titleStmt>
        </work>z Symphony No. 7 (in one movement)r1  N)rI   r2  r   r  r   r3  rO   r4  r5  r-   r6  assertIsNoner7  )r%   r  r8  r:  r&   s        r'   testMetaTitle2Test.testMetaTitle2  s     %5  """4.d#z23<<0&--.r*   c                    Sn[         R                  " U5      n[        R                  " 5       n[        R
                  " X5      nU R                  X#5        U R                  UR                  5        g)z%
metaSetComposer() with no composers
4<work xmlns="http://www.music-encoding.org/ns/mei"/>N)	rI   r2  r   r  r   metaSetComposerrO   r>  composer)r%   r  r:  r&   s       r'   testMetaComposer1Test.testMetaComposer1  sV     J%  "%%d1d#&//*r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z3
metaSetComposer() with one composer in <respStmt>
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <respStmt>
                    <persName role="composer">Jean Sibelius</persName>
                </respStmt>
            </titleStmt>
        </work>Jean SibeliusN	rI   r2  r   r  r   rC  rO   r-   rD  r%   r  expComposerr:  r&   s        r'   testMetaComposer2Test.testMetaComposer2  s\     %%  "%%d1d#oo6r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z3
metaSetComposer() with one composer in <composer>
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <composer>Jean Sibelius</composer>
            </titleStmt>
        </work>rH  NrI  rJ  s        r'   testMetaComposer3Test.testMetaComposer3  s\    
 %%  "%%d1d#oo6r*   c                    Sn[         R                  " U5      nSnSn[        R                  " 5       n[        R
                  " X5      nU R                  XE5        UR                  X#4;  a  U R                  S5        gg)z>
metaSetComposer() with two composers, one specified each way
a&  <work xmlns="http://www.music-encoding.org/ns/mei">
            <titleStmt>
                <respStmt>
                    <persName role="composer">Jean Sibelius</persName>
                </respStmt>
                <composer>Sibelius, Jean</composer>
            </titleStmt>
        </work>)rH  Sibelius, Jean)rR  rH  z+composer names do not match in either orderN)	rI   r2  r   r  r   rC  rO   	composersfail)r%   r  expComposers1expComposers2r:  r&   s         r'   testMetaComposer4Test.testMetaComposer4  ss     %;;  "%%d1d#M#AAIICD Br*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z
metaSetDate() with no dates
rB  N	rI   r2  r   r  r   metaSetDaterO   r-   dateCreatedr%   r  expDater:  r&   s        r'   testMetaDate1Test.testMetaDate1/  s]     J%  "!!$-d#"4"45r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z
metaSetDate() with @isodate
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date isodate="1924-03-02"/>
                </creation>
            </history>
        </work>
1924/03/02NrZ  r]  s        r'   testMetaDate2Test.testMetaDate2=  ^     %  "!!$-d#"4"45r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z
metaSetDate() with text
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date>1924-03-02</date>
                </creation>
            </history>
        </work>rb  NrZ  r]  s        r'   testMetaDate3Test.testMetaDate3Q  re  r*   zmusic21.mei.base.environLocalc                Z   Sn[         R                  " U5      nSn[        R                  R	                  S5      n[
        R                  " 5       n[        R                  " X%5      nU R                  XV5        U R                  X6R                  5        UR                  R                  U5        g)z$
metaSetDate() with text that fails
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date>2 March 1924</date>
                </creation>
            </history>
        </work>Nz2 March 1924)rI   r2  r   _MISSED_DATEr>   r   r  r[  rO   r-   r\  warnrP   )r%   mockEnvironr  r^  expWarnr:  r&   s          r'   testMetaDate4Test.testMetaDate4e  s    
 %##**>:  "!!$-d#"4"45009r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z-
metaSetDate() with @notbefore and @notafter
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date notbefore="1915" notafter="1924"/>
                </creation>
            </history>
        </work>1915/--/-- to 1924/--/--NrZ  r]  s        r'   testMetaDate5Test.testMetaDate5|  ^     %,  "!!$-d#"4"45r*   c                    Sn[         R                  " U5      nSn[        R                  " 5       n[        R
                  " X5      nU R                  X45        U R                  X$R                  5        g)z,
metaSetDate() with @startdate and @enddate
z<work xmlns="http://www.music-encoding.org/ns/mei">
            <history>
                <creation>
                    <date startdate="1915" enddate="1924"/>
                </creation>
            </history>
        </work>rq  NrZ  r]  s        r'   testMetaDate6Test.testMetaDate6  rt  r*   c                l    SnSnSSSS.nSn[         R                  " XU5      nU R                  XE5        g)zN
_attrTranslator(): the usual case works properly when "attr" is in "mapping"
twonumbersr         onery  threeN)r   _attrTranslatorr-   )r%   attrrb   mappingrf   r&   s         r'   testAttrTranslator1Test.testAttrTranslator1  s?     A2%%d':*r*   c                *   SnSnSSSS.nSnU R                  [        R                  [        R                  XU5         [        R                  " XU5        g	! [        R                   a(  nU R	                  XER
                  S   5         S	nAg	S	nAff = f)
zI
_attrTranslator(): exception is raised properly when "attr" isn't found
fourrz  r   r{  r|  r}  z.Unexpected value for "numbers" attribute: fourr   N)r3   r   MeiValueErrorr  r-   r6   )r%   r  rb   r  rf   r   s         r'   testAttrTranslator2Test.testAttrTranslator2  s     A2C$,,d.B.BDPWX	6  W5!! 	6Xzz!}55	6s   A B*BBz music21.mei.base._attrTranslatorc                v    Sn[         R                  " U5        UR                  US[         R                  5        g)zC
_accidentalFromAttr(): ensure proper arguments to _attrTranslator
sr   N)r   _accidentalFromAttrrP   _ACCID_ATTR_DICTr%   	mockTransr  s      r'   testAccidentalTest.testAccidental  s/    
   &))$9N9NOr*   c                v    Sn[         R                  " U5        UR                  US[         R                  5        g)zA
_accidGesFromAttr(): ensure proper arguments to _attrTranslator
r  	accid.gesN)r   _accidGesFromAttrrP   _ACCID_GES_ATTR_DICTr  s      r'   testAccidGesTest.testAccidGes  s/    
 t$))$T=V=VWr*   c                v    Sn[         R                  " U5        UR                  US[         R                  5        g)zC
_qlDurationFromAttr(): ensure proper arguments to _attrTranslator
r  durN)r   _qlDurationFromAttrrP   _DUR_ATTR_DICTr  s      r'   testDurationTest.testDuration  s/    
   &))$t7J7JKr*   c                    Sn[         R                  " SSS9Ul        Sn[        R                  " U5      nUR                  US[        R                  5        U R                  X45        g)zE
_articulationFromAttr(): ensure proper arguments to _attrTranslator
marcasdfrD   )rb   rL   )rD   r   N)r   rH   rL   r   _articulationFromAttrrP   _ARTIC_ATTR_DICTr-   )r%   r  r  rf   r&   s        r'   testArticulation1Test.testArticulation1  sW    
 !%V!!L	++D1))$9N9NO*r*   c                   Sn[         R                  [         R                  4n[        R                  " U5      nU R                  SUR                  5        [        [        U5      5       H  nXE   nX5   nU R                  Xg5        M     g)z:
_articulationFromAttr(): proper handling of "marc-stacc"
z
marc-staccr   N)
r   StrongAccentStaccator   r  r-   r  r   lenr!   r%   r  r  rf   r&   r   
actualHereexpectedHeres           r'   testArticulation2Test.testArticulation2  st    
 !..0F0FG++D1I001s8}%AJ#;L!!*; &r*   c                   Sn[         R                  [         R                  4n[        R                  " U5      nU R                  SUR                  5        [        [        U5      5       H  nXE   nX5   nU R                  Xg5        M     g)z9
_articulationFromAttr(): proper handling of "ten-stacc"
z	ten-staccr   N)
r   Tenutor  r   r  r-   r  r   r  r!   r  s           r'   testArticulation3Test.testArticulation3  st    
 !((-*@*@A++D1I001s8}%AJ#;L!!*; &r*   c                   SnSn[         R                  " U5      Ul        U R                  [         R                  [         R                  U5        UR                  US[         R                  5         [         R                  " U5        g! [         R                   a(  nU R                  X4R                  S   5         SnAgSnAff = f)z7
_articulationFromAttr(): proper handling of not-found
garbagezerror messager   r   N)	r   r  r+  r3   r  rP   r  r-   r6   )r%   r  r  rf   r   s        r'   testArticulation4Test.testArticulation4  s    
 " $ 2 28 <	$,,d.H.H$O))$9N9NO	6&&t,!! 	6Xzz!}55	6s   1B CB??Cz&music21.mei.base._articulationFromAttrc                l    SnS/Ul         S/n[        R                  " U5      nU R                  X45        g)z>
_makeArticList(): properly handles single-articulation lists
accaccentN)rL   r   _makeArticListr-   )r%   	mockArticr  rf   r&   s        r'   testArticList1Test.testArticList1  s8    
 "*	:$$T**r*   c                   ^ SnS/S/S//mU4S jUl         / SQn[        R                  " U5      nU R                  X45        g)z=
_makeArticList(): properly handles multi-articulation lists
zacc stacc marcr  staccatomarcatoc                &   > TR                  S5      $ Nr   popr%  mockReturnss    r'   r'  %Test.testArticList2.<locals>.<lambda>$  s    {q/Ar*   )r  r  r  Nr+  r   r  r-   r%   r  r  rf   r&   r  s        @r'   testArticList2Test.testArticList2  sG    
   zJ<)= A	4$$T**r*   c                   ^ SnS/SS/S//mU4S jUl         / SQn[        R                  " U5      nU R                  X45        g)z?
_makeArticList(): properly handles the compound articulations
zacc marc-stacc marcr  r  r  c                 &   > TR                  S5      $ r  r  r  s    r'   r'  %Test.testArticList3.<locals>.<lambda>0  s    0Br*   )r  r  r  r  Nr  r  s        @r'   testArticList3Test.testArticList3)  sJ    
 % zIz#:YKH B	?$$T**r*   c                ^    SnSnSn[         R                  " X5      nU R                  X45        g)z;
_getOctaveShift(): properly handles positive displacement
15abover{  Nr   _getOctaveShiftr-   r%   disdisPlacerf   r&   s        r'   testOctaveShift1Test.testOctaveShift15  s1     %%c4*r*   c                ^    SnSnSn[         R                  " X5      nU R                  X45        g)z;
_getOctaveShift(): properly handles negative displacement
22belowNr  r  s        r'   testOctaveShift2Test.testOctaveShift2?  s1     %%c4*r*   c                ^    SnSnSn[         R                  " X5      nU R                  X45        g)zG
_getOctaveShift(): properly handles positive displacement with "None"
r   Nr   r  r  s        r'   testOctaveShift3Test.testOctaveShift3I  s1     %%c4*r*   c                ^    SnSnSn[         R                  " X5      nU R                  X45        g)z6
_getOctaveShift(): properly positive two "None" args
Nr   r  r  s        r'   testOctaveShift4Test.testOctaveShift4S  s1     %%c4*r*   c                2   Sn[         R                  " SSS9[         R                  " S5      4n[        R                  " U5      nU R	                  [        US   5      [        US   5      5        U R	                  [        US   5      [        US   5      5        g)	z
_barlineFromAttr(): rptboth
rptbothendr{  timesstartr   r   N)r	   Repeatr   _barlineFromAttrr-   typer%   rightrf   r&   s       r'   testBarlineFromAttr1Test.testBarlineFromAttr1]  sy     JJuA.

70CD&&u-hqk*DO<hqk*DO<r*   c                >   Sn[         R                  " SSS9n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)z
_barlineFromAttr(): rptend
rptendr  r{  r  Nr	   r  r   r  r-   r  	directionr  r  s       r'   testBarlineFromAttr2Test.testBarlineFromAttr2g  su     ::e1-&&u-hf6++X-?-?@8r*   c                @   Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR                  UR                  5        U R	                  UR                  UR                  5        g)z
_barlineFromAttr(): rptstart
rptstartr  Nr  r  s       r'   testBarlineFromAttr3Test.testBarlineFromAttr3r  ss     ::g&&&u-hf6++X-?-?@8r*   c                    Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR
                  UR
                  5        g)z%
_barlineFromAttr(): end (--> final)
r  finalN)r	   Barliner   r  r-   r  r  s       r'   testBarlineFromAttr4Test.testBarlineFromAttr4}  sW     ;;w'&&u-hf66r*   c                    Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR
                  UR
                  5        g)z
_tieFromAttr(): "i"
rj   r  Nr   Tier   _tieFromAttrr-   r  r  s       r'   testTieFromAttr1Test.testTieFromAttr1  sW     777#""5)hf66r*   c                    Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR
                  UR
                  5        g)z
_tieFromAttr(): "ti"
rj   continueNr  r  s       r'   testTieFromAttr2Test.testTieFromAttr2  W     77:&""5)hf66r*   c                    Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR
                  UR
                  5        g)z
_tieFromAttr(): "m"
rj   r	  Nr  r  s       r'   testTieFromAttr3Test.testTieFromAttr3  r  r*   c                    Sn[         R                  " S5      n[        R                  " U5      nU R	                  [        U5      [        U5      5        U R	                  UR
                  UR
                  5        g)z
_tieFromAttr(): "t"
rj   stopNr  r  s       r'   testTieFromAttr4Test.testTieFromAttr4  sV     776?""5)hf66r*   c                   [         R                  " SSSS.S9nSUl        [        R                  " U5      nU R                  U[        R                  5        U R                  SUR                  5        U R                  SUR                  5        g	)
z7
sylFromElement() where @con is given and @wordpos="i"
sylr   r  wordposconr   ChribeginzChri N
rI   rJ   textr   sylFromElementr!   r   Lyricr-   syllabicr%   r   r&   s      r'   testSyl1Test.testSyl1  sl     }}Us3+GH	$$T*fdjj1&//2&++.r*   c                   [         R                  " SSSS.S9nSUl        [        R                  " U5      nU R                  U[        R                  5        U R                  SUR                  5        U R                  SUR                  5        g	)
z7
sylFromElement() where @con is given and @wordpos="m"
r  mtr  r   stomiddlez~sto~Nr  r   s      r'   testSyl2Test.testSyl2  sl     }}Us3+GH	$$T*fdjj16??3&++.r*   c                   [         R                  " SSSS.S9nSUl        [        R                  " U5      nU R                  U[        R                  5        U R                  SUR                  5        U R                  SUR                  5        g	)
z;
sylFromElement() where @con is not given and @wordpos="t"
r  r%  dr  r   pherr  z-pherNr  r   s      r'   testSyl3Test.testSyl3  sl     }}Us3+GH	$$T*fdjj10&++.r*   c                   [         R                  " S5      nSUl        [        R                  " U5      nU R                  U[        R                  5        U R                  SUR                  5        U R                  SUR                  5        g)z2
sylFromElement() where @wordpos is not specified
r  shoesingleNr  r   s      r'   testSyl4Test.testSyl4  se     }}U#	$$T*fdjj16??3-r*   c                   [         R                  " SSS0S9n[         R                  " [         S35      nSUl        UR	                  U5        [
        R                  " USS9nU R                  S	[        U5      5        U R                  US
   [        R                  5        U R                  SUS
   R                  5        U R                  SUS
   R                  5        U R                  SUS
   R                  5        g)z0
verseFromElement() with one <syl> and @n given
versen42r   r  Hin-rD   backupNr   r   r  Hinr  N)rI   rJ   r   r  appendr   verseFromElementr-   r  r!   r   r  r  number)r%   r   r  r&   s       r'   
testVerse1Test.testVerse1  s     }}Wc4[9mmvhcN+C&&tQ7CK(fQi4&)"4"45q	/VAY--.r*   c                   [         R                  " S5      n[         R                  " [         S35      nSUl        UR	                  U5        [         R                  " [         S35      nSUl        UR	                  U5        [         R                  " [         S35      nSUl        UR	                  U5        [
        R                  " USS9nU R                  S[        U5      5        U H?  nU R                  U[        R                  5        U R                  SUR                  5        MA     U R                  S	US
   R                  5        U R                  SUS
   R                  5        U R                  SUS   R                  5        U R                  SUS   R                  5        U R                  SUS   R                  5        U R                  SUS   R                  5        g)z6
verseFromElement() with three <syl> and @n not given
r5  r  r8  z-de-z-mithrD   r9  r|  r  r   r;  r'  r   der  r{  mithN)rI   rJ   r   r  r<  r   r=  r-   r  r!   r   r  r>  r  )r%   r   r  r&   eachSyls        r'   
testVerse2Test.testVerse2  sw    }}W%mmvhcN+CmmvhcN+CmmvhcN+C&&tQ7CK(G!!'4::6Q/  	&)"4"45q	/6!9#5#56vay~~.q	 2 230r*   c                n   [         R                  " SSS0S9n[         R                  " [         S35      nSUl        UR	                  U5        [
        R                  " U5      nU R                  S[        U5      5        U R                  US   [        R                  5        U R                  S	US   R                  5        U R                  S
US   R                  5        U R                  SUS   R                  5        UR                  R                  [
        R                   R#                  S5      5        g)z2
verseFromElement() with one <syl> and invalid @n
r5  r6  mistaker   r  r8  r   r   r  r;  NrI   rJ   r   r  r<  r   r=  r-   r  r!   r   r  r  r>  rk  rP   _BAD_VERSE_NUMBERr>   r%   rl  r   r  r&   s        r'   
testVerse3Test.testVerse3  s    
 }}Wc9-=>mmvhcN+C&&t,CK(fQi4&)"4"45q	/F1I,,-001G1G1N1Ny1YZr*   c                l   [         R                  " S5      n[         R                  " [         S35      nSUl        UR	                  U5        [
        R                  " U5      nU R                  S[        U5      5        U R                  US   [        R                  5        U R                  SUS   R                  5        U R                  SUS   R                  5        U R                  SUS   R                  5        UR                  R                  [
        R                   R#                  S5      5        g	)
z-
verseFromElement() with one <syl> and no @n
r5  r  r8  r   r   r  r;  NoneNrI  rK  s        r'   
testVerse4Test.testVerse4&  s    
 }}W%mmvhcN+C&&t,CK(fQi4&)"4"45q	/F1I,,-001G1G1N1Nv1VWr*   zmusic21.note.Notez)music21.mei.base._processEmbeddedElementszmusic21.mei.base.safePitchzmusic21.mei.base.makeDurationc           	        [         R                  " SSSSSSS.S9nS	Ul        S
Ul        [        R                  " 5       nXdl        / Ul        Un[
        R                  " US5      nU R                  XvU5        UR                  SSS5        UR                  SS5        UR                  UR                  5        U R                  SUR                  R                  5        U R                  SUR                  R                  R                  5        U R                  SUR                  R                  5        U R                  UR                  UR                  5        g)z
noteFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)

(mostly-unit test; mock out Note, _processEmbeddedElements(),
 safePitch(), and makeDuration())
r   rn   r  2r   rz   pnamer   octr  dotsr   makeDuration() returnsafePitch() returnNro         ?r   r   )rI   rJ   rL   r   rH   r   noteFromElementr-   rP   r  r  r   extendr   r   )	r%   mockMakeDurationmockSafePitchmockProcEmbElmockNoter   mockNewNoterf   r&   s	            r'   	testUnit1Test.testUnit1@  s!    }}VcCPS\_58-: ;(?%%9"nn& +%'"%%dD17--c3<00a8(()C)CDKNN556K55<<GGHKOO667)668L8LMr*   c           	     "   [         R                  " SSSSSSS.S9n[        R                  " U5      nU R	                  S	UR
                  5        U R	                  S
UR                  5        U R	                  SUR                  R                  5        g)z
noteFromElement(): all the elements that go in Note.__init__()...
                   'pname', 'accid', 'oct', 'dur', 'dots'
(corresponds to testUnit1() with no mocks)
r   rn   r  rS  r   rz   rT  r   D#2      ?r   N	rI   rJ   r   r[  r-   nameWithOctavequarterLengthr   rW  r   s      r'   testIntegration1aTest.testIntegration1a_  s|     }}VcCPS\_58-: ;%%d+ 5 56f223FOO001r*   c                    [         R                  " SSSSSS.S9n[        R                  " U5      nU R	                  SUR
                  5        U R	                  S	UR                  5        U R	                  S
UR                  R                  5        g)z
noteFromElement(): all the elements that go in Note.__init__()...
                   'pname', 'accid', 'oct', 'dur', 'dots'
(this has different arguments than testIntegration1a())
r   rn   r6  rS  r   )rU  r   rV  r  r   D2rZ  r   Nrg  r   s      r'   testIntegration1bTest.testIntegration1bl  su     }}VcCPS\_,`a%%d+v445f223FOO001r*   z!music21.mei.base.pitch.Accidentalc                |   [         R                  " SSSSS.S9nSUl        SUl        S	Ul        [        R                  " 5       nXul        S
S[
        R                  " 5       /Ul        Un[        R                  " SS5      [        R                  " SS
5      /n	[        R                  " US5      n
U R                  XU
5        UR                  SSS5        UR                  UR                  l        U R                  S
UR
                  R                  R                  5        U R!                  UR
                  R                  R"                  S   S   S   [
        R                  5        U R                  XR"                  5        UR                  UR                  5        U R                  SUR$                  R                  5        U R                  SUR
                  R&                  R                  5        U R                  SUR(                  R                  5        U R                  UR                  UR*                  5        g)z
noteFromElement(): adds <artic>, <accid>, and <dot> elements held within

(mostly-unit test; mock out Note, _processEmbeddedElements(),
safePitch(), and makeDuration())
r   rn   rS  r   rU  rV  r  r   rX  rY  zan accidentalr   ro   rZ  r   N)rI   rJ   rL   r   rH   r   r  callr   r[  r-   rP   r   rc   r<  r  r!   call_args_listr  r\  r   r   )r%   r   r]  r^  r_  r`  r   ra  rf   expMockMakeDurr&   s              r'   	testUnit2Test.testUnit2x  s    }}Vc#c,RS(?%%9"!0	nn& +&'m.D.D.F%G"))C+TYYsA->?%%dD17--c4='0'='=$K55<<GGHk77>>MMaPQRSTUV+44	6)H)HI(()C)CDKNN556K55<<GGHKOO667)668L8LMr*   c                   [         R                  " SSSSS.S9nUR                  [         R                  " [         S35      5        UR                  [         R                  " [         S3SS0S95        UR                  [         R                  " [         S	3S	S
0S95        [        R
                  " U5      nU R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  R                  5        U R                  S[        UR                  5      5        U R                  UR                  S   [        R                  5        g)zu
noteFromElement(): adds <artic>, <accid>, and <dot> elements held within
(corresponds to testUnit2() with no mocks)
r   rn   rS  rq  r   dotr   staccr   r  re  g      @r   r   N)rI   rJ   r<  r   r   r[  r-   rh  ri  r   rW  r  r   r!   r  r   s      r'   testIntegration2Test.testIntegration2  s   
 }}Vc#c,RSEMMVHC.12EMMVHE"2GW;MNOEMMVHE"2GS>JK%%d+ 5 56f223FOO001C 4 456f2215}7M7MNr*   zmusic21.mei.base._tieFromAttrzmusic21.mei.base.addSlursc                   [         R                  " SSSSSSSSS	S
SSS[        SSS0S9nSUl        SUl        [        R
                  " 5       n	Xl        / Ul        S/Ul        SUl        U	n
[        R                  " US5      nU R                  XU5        UR                  SSS5        UR                  SS5        UR                  UR                  5        U R                  SU	R                  5        U	R                  R                  R                  S/5        U R                  SU	R                  5        U R                  UR                  U	R                  5        UR                  XS5        g)z
noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle

(mostly-unit test; mock out Note, _processEmbeddedElements(),
safePitch(), and makeDuration())
r   rU  rn   r   r  rV  rS  r  r   rW  rz   r   ry  123r   i1r   rX  rY  	staccato!a tie!slur bundlero   rZ  r   N)rI   rJ   r   rL   r   rH   r   r[  r-   rP   r  r   r\  r   r   )r%   mockSlurmockTiemockArticListr]  r^  r_  r`  r   ra  rf   r&   s               r'   	testUnit3Test.testUnit3  sM    }}VWc7CPSUZ\_-3S'7FTY-2D-: ; )@%%9"nn& +%'"&1]"'%%dM:7--c3<00a8(()C)CD/!!((@@+O;??3)668L8LM((MJr*   c                   [         R                  " SSSSSSSSS	S
S[        SSSSS0S9n[        R                  " 5       n[
        R                  " X5      nU R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  R                  5        U R                  SUR                  5        U R                  S[        UR                  5      5        U R                  UR                  S   [        R                   5        U R                  ["        R$                  " S5      UR"                  5        g)z}
noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle
(corresponds to testUnit3() with no mocks)
r   rU  rn   r   r  rV  rS  r  r   rW  rz   asdf1234r   ry  r   r~  r   re  rf  r   r   r  N)rI   rJ   r   r   r$   r   r[  r-   rh  ri  r   rW  r  r  r   r!   r  r   r  r%   r   r#   r&   s       r'   testIntegration3Test.testIntegration3  s   
 }}VWc7CPSUZ\_-3S&*gW^-2D-: ; **,
%%d7 5 56f223FOO001VYY/C 4 456f2215}7M7MN)6::6r*   zmusic21.mei.base.scaleToTupletzmusic21.pitch.Accidentalc                   [         R                  " SSSSSSSSSS.S	9nS
Ul        [        R                  " 5       n[        R                  " 5       Ul        [        R                  " 5       Ul        SUR                  l        Xl        / Ul        SUl        SUl        UR                  n	[        R                  " US5      n
U R                  X5        UR                  SSS5        UR                  SS5        UR                  UR                  5        UR                  X5        UR                  S5        U R                  SUR
                  R                  R                  5        g)z
noteFromElement(): adds tuplet-related attributes; plus @m21Beam where the
    duration doesn't require adjusting beams

(mostly-unit test)
r   rn   rS  r   5r  r  rU  rV  r  m21TupletNumm21TupletNumbasem21TupletSearchr  m21Beamr   rY  quarterzmade the tupletzthe accidentalr  NrZ  r   ro   )rI   rJ   rL   r   rH   beamsr  r   r[  r-   rP   fillr  )r%   r   rT   r]  r^  r_  r`  r   ra  rf   r&   s              r'   	testUnit4Test.testUnit4  s0    }}Vc#c=@VY@G:='-S T &:"nn& NN,(,(8%-6%%* +%'""3
!1	**%%dM:*--c4=00a8(()C)CD**;=))#.K--22==>r*   c                   [         R                  " SSSSSSSSSS.S	9n[        R                  " 5       n[        R
                  " X5      nU R                  S
UR                  5        U R                  SUR                  5        U R                  SUR                  R                  5        U R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  5        g)zM
noteFromElement(): @m21TupletNum
(corresponds to testUnit4() with no mocks)
r   rn   rS  r   r  r  r  r  r   re  rZ  r  N)rI   rJ   r   r$   r   r[  r-   rh  ri  r   r  r  r  r  r  s       r'   testIntegration4Test.testIntegration4  s    
 }}Vc#c=@VY@G:='-S T **,
%%d7 5 56f223FOO$8$89f112f556&"8"89r*   zmusic21.duration.GraceDurationc           	        [         R                  " SSSSSSS.S9n[         R                  " [         S	35      nUR                  U5        S
Ul        [
        R                  " 5       n[
        R                  " 5       Ul        Xl        [
        R                  " [        R                  S9/Ul        [
        R                  " [        R                  S9Ul        SUR                  l        Un	[        R                  " US5      n
U R                  X5        UR!                  SSS5        UR!                  SS5        UR!                  UR                  5        UR                  R"                  R!                  SS5        U R                  UR                  UR                  5        U R                  UR                  UR$                  5        g)z
noteFromElement(): test @grace and @m21Beam where the duration requires adjusting beams,
    and contained <syl>

(mostly-unit test)
r   rn   rS  16r  r  rU  rV  r  r  gracer   r  rY  rB   16thr  N      ?r   )rI   rJ   r   r<  rL   r   rH   r  r   r  r   Durationr  r   r[  r-   rP   r  lyrics)r%   	mockGracer]  r^  r_  r`  r   sylElemra  rf   r&   s              r'   	testUnit5Test.testUnit5&  s[    }}Vc#d8?%-Q R--6(#/G%9"nn& NN, +&*nndjj&I%J"!%9J9J!K	&,	#%%dM:*--c4=00q9(()C)CD66vwG//1E1EF33[5G5GHr*   c           	        [         R                  " SSSSSSS.S9n[         R                  " [         S	35      nS
Ul        UR	                  U5        [
        R                  " 5       n[        R                  " X5      nU R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  R                  5        U R                  SUR                  R                  S   R                   5        U R                  SUR                  R                  S   R                  5        U R                  SUR                  R                  S   R                   5        U R                  SUR                  R                  S   R                  5        U R                  S[#        UR$                  5      5        U R                  S
UR$                  S   R                  5        g)z
noteFromElement(): test @grace and @m21Beam where the duration requires adjusting beams,
    and contained <syl>
(corresponds to testUnit5() with no mocks)
r   rn   rS  r  r  r  r  r   r  zwords!rm          r  r   r   r{  N)rI   rJ   r   r  r<  r   r$   r   r[  r-   rh  ri  r   r  r  	beamsListr>  r  r  )r%   r   r  r#   r&   s        r'   testIntegration5Test.testIntegration5I  s}    }}Vc#d8?%-Q R--6(#/G**,
%%d7v445f223!5!56FLL2215<<=&,,"8"8";"@"@AFLL2215<<=&,,"8"8";"@"@AC./6==#3#8#89r*   z!music21.mei.base.verseFromElementc                  ^ Sn[         R                  " U5      nSUl        [        R                  " 5       n[        R                  " 5       Ul        Xul        / Ul        Un[        R                  " SS9[        R                  " SS9/[        R                  " SS9//mU4S jn	Xl        TS   S   TS   S	   TS	   S   /n
[        R                  " US
5      nU R                  X5        U R                  XR                  5        U R                  SUR                  5        UR                  [        R                  S	S9  UR                  [        R                  SS9  g)z?
noteFromElement(): test contained <verse>

(mostly-unit test)
  <note pname="D" oct="2" dur="16" xmlns="http://www.music-encoding.org/ns/mei">
            <verse>
                <syl>au</syl>
                <syl>luong</syl>
            </verse>
            <verse>
                <syl>sun</syl>
            </verse>
        </note>
        rY  aurb   luongsunc                X   > [          S3U R                  :X  d   eTR                  S5      $ )z3
Check that it gets called with the right elements
r5  r   )r   r.   r  )
inner_elemr:  
vfeReturnss     r'   mockVerseFESideEffect-Test.testUnit6.<locals>.mockVerseFESideEffect  s-     XU#z~~555>>!$$r*   r   r   r  r{  r9  N)rI   r2  rL   r   rH   r  r+  r   r[  r-   r  r  assert_any_callANY)r%   mockVerseFEunused_mockMakeDurationr^  r_  r`  r   ra  rf   r  	expLyricsr&   r  s               @r'   	testUnit6Test.testUnit6b  s,   	 %%9"nn& NN, +%'"~~40$..g2NO~~5124
	% #8]1%z!}Q'7Aq9IJ	%%dM:*MM2K223##DHHa#8##DHHa#8r*   c                   Sn[         R                  " U5      n[        R                  " 5       n[        R
                  " X5      nU R                  S[        UR                  5      5        U R                  SUR                  S   R                  5        U R                  SUR                  S   R                  5        U R                  SUR                  S   R                  5        U R                  SUR                  S   R                  5        U R                  SUR                  S   R                  5        U R                  SUR                  S   R                  5        g	)
zV
noteFromElement(): test contained <verse>
(corresponds to testUnit6() with no mocks)
r  r|  r  r   r  r   r  r{  N)rI   r2  r   r$   r   r[  r-   r  r  r  r>  r  s       r'   testIntegration6Test.testIntegration6  s   
	 %**,
%%d7C./v}}Q/445&--"2"7"78a 0 5 56FMM!,334FMM!,334FMM!,334r*   zmusic21.note.Restc                   [         R                  " SSSSS[        SSSS	SS
S0S9nSUl        [        R
                  " S5      nXSl        SUl        UR                  n[        R                  " U5      nU R                  Xg5        UR                  UR                  S9  UR                  SS5        UR                  UR                  U5        U R                  SUR                  5        g)zM
restFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes
restr  r   rW  rz   the idr  r  r  m21TupletTyper  r   zthe durationznew rest
tupletizedr   rZ  r   N)rI   rJ   r   rL   r   rH   r   restFromElementr-   rP   r  )r%   rT   mockMakeDurmockRestr   mockNewRestrf   r&   s           r'   testUnit1TestRestFromElement!Test.testUnit1TestRestFromElement  s     }}VUCfh-;SBTVY-<g-G H $2 nnZ0 +".
**%%d+*((+2J2J(K++C3**8+@+@$G;>>2r*   c                   [         R                  " SSSSS[        SSSS	SS
S0S9n[        R                  " U5      nU R                  [        SS5      UR                  5        U R                  SUR                  R                  5        U R                  SUR                  5        U R                  SUR                  R                  S   R                  5        g)ze
restFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes

(without mock objects)
r  r  r   rW  rz   r  r  r  r  r  r  r   r   rD   r   r   N)rI   rJ   r   r   r  r-   r   ri  r   rW  r  tupletsr  r   s      r'   testIntegration1Test.testIntegration1  s     }}VUCfh-;SBTVY-<g-G H %%d+!Q)=)=>FOO001699-&//"9"9!"<"A"ABr*   c                <   [         R                  " SSSSS[        SSSS	SS
S0S9n[        R                  " U5      nU R                  U[        R                  5        U R                  UR                  R                  5        U R                  SUR                  5        g)zN
spaceFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes
r  r  r   rW  rz   r  r  r  r  r  r  r   N)rI   rJ   r   r   spaceFromElementr!   r   Rest
assertTruestylehideObjectOnPrintr-   r  r   s      r'   testUnit2TestRestFromElement!Test.testUnit2TestRestFromElement  s     }}VUC-3S-3X-;S-?-<g-/ 0 &&t,fdii0667699-r*   c                   [         R                  " SSSSS[        SSSS	SS
S0S9n[        R                  " U5      nU R                  [        SS5      UR                  5        U R                  SUR                  R                  5        U R                  SUR                  5        U R                  SUR                  R                  S   R                  5        g)zf
spaceFromElement(): test @dur, @dots, @xml:id, and tuplet-related attributes

(without mock objects)
spacer  r   rW  rz   r  r  r  r  r  r  r   r   rD   r   r   N)rI   rJ   r   r   r  r-   r   ri  r   rW  r  r  r  r   s      r'   #testIntegration2TestRestFromElement(Test.testIntegration2TestRestFromElement  s     }}WeS&#vx.<cCUWZ.=w.H I &&t,!Q)=)=>FOO001699-&//"9"9!"<"A"ABr*   z music21.mei.base.restFromElementc                    [         R                  " SSS0S9nSUl        [        R                  " U5      nU R                  UR                  U5        UR                  US5        g)zK
mRestFromElement(): reacts properly to an Element with the @dur attribute
mRestr  rS  r   zthe restN)rI   rJ   rL   r   mRestFromElementr-   rP   r%   mockRestFromElementr   r&   s       r'   testUnit3TestRestFromElement!Test.testUnit3TestRestFromElement  sX    
 }}WeS\:+5(&&t,,996B33D$?r*   c                "   [         R                  " S5      n[        R                  " 5       Ul        [
        R                  " U5      nU R                  UR                  U5        UR                  US5        U R                  UR                  5        g)zN
mRestFromElement(): reacts properly to an Element without the @dur attribute
r  N)rI   rJ   r   rH   rL   r   r  r-   rP   r  m21wasMRestr  s       r'   testUnit4TestRestFromElement!Test.testUnit4TestRestFromElement  sk    
 }}W%+/>>+;(&&t,,996B33D$?**+r*   z!music21.mei.base.spaceFromElementc                    [         R                  " SSS0S9nSUl        [        R                  " U5      nU R                  UR                  U5        UR                  US5        g)zL
mSpaceFromElement(): reacts properly to an Element with the @dur attribute
mSpacer  rS  r   z
the spacerN)rI   rJ   rL   r   mSpaceFromElementr-   rP   r%   	mockSpacer   r&   s       r'   testUnit5TestRestFromElement!Test.testUnit5TestRestFromElement  sV    
 }}Xucl;!-	''-//8))$5r*   c                "   [         R                  " S5      n[        R                  " 5       Ul        [
        R                  " U5      nU R                  UR                  U5        UR                  US5        U R                  UR                  5        g)zO
mSpaceFromElement(): reacts properly to an Element without the @dur attribute
r  N)rI   rJ   r   rH   rL   r   r  r-   rP   r  r  r  s       r'   testUnit6TestRestFromElement!Test.testUnit6TestRestFromElement'  si    
 }}X&!%!1	''-//8))$5**+r*   c           	     >    [         R                  " [         S3XX#US9$ )z=
Factory function for the Element objects that are a <note>.
r   rT  )rI   rJ   r   )rU  r   octArgr  rW  s        r'   makeNoteElemsChordFromElement"Test.makeNoteElemsChordFromElement<  s$    
 }}xt_E!'t= 	=r*   zmusic21.chord.Chordz music21.mei.base.noteFromElementc           
     J   [         R                  " SSSS.S9nS Vs/ s H  n[        R                  USSSS5      PM     nnU H  nUR	                  U5        M     S	Ul        S
Ul        [        R                  " 5       n	Xl        / Ul        [        R                  " US5      n
U R                  X5        UR                  SS5        UR                  [        S5       Vs/ s H  oR
                  PM     snS9  U R                  SU	R                  R                  5        U R                  SU	R                  R                   R                  5        U R                  SU	R"                  R                  5        U R                  UR
                  U	R$                  5        gs  snf s  snf )zX
chordFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)
chordr   rz   r  rW  r   cegNr   a noterX  rZ  r   r|  notesr   )rI   rJ   r   r  r<  rL   r   rH   r   chordFromElementr-   rP   r   r  r  r   r\  r   r   )r%   mockNoteFromEr]  r_  	mockChordr   xnoteElementseachElementmockNewChordr&   r   s               r'   testUnit1ChordFromElementTest.testUnit1ChordFromElementD  sk    }}WS#-FG!02!0A ::1dCdS!0 	 2'KKK$ (%-"(?%~~'!-%'"&&tT2.00a8))UZ[\U]0^U]PQ1K1KU]0^)_LOO667L66==HHIL,,778)668M8MN%2 1_s   #FF c           
     *   [         R                  " SSSS.S9nS Vs/ s H  n[        R                  USSSS	5      PM     nnU H  nUR	                  U5        M     S
n[
        R                  " U5      nU R                  XVR                  5        gs  snf )z
chordFromElement(): all the basic attributes (i.e., @pname, @accid, @oct, @dur, @dots)

(corresponds to testUnit1() with no mocks)
r  r   rz   r  r   r  r6  r   r   \Chord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} Dotted QuarterN)	rI   rJ   r   r  r<  r   r  r-   fullNamer%   r   r  r  r  r   r&   s          r'    testIntegration1ChordFromElement%Test.testIntegration1ChordFromElementb  s     }}WS#-FG!02!0A ::1c3SQ!0 	 2'KKK$ (B&&t,72s   #Bc           
        [         R                  " SSSS.S9nS Vs/ s H  n[        R                  USSSS5      PM     nnU H  nUR	                  U5        M     UR	                  [         R                  " [
         S	3S
S95        SUl        SUl        [        R                  " 5       n	Xl        [        R                  " 5       /Ul        U	n
[        R                  " US5      nU R                  XU5        UR                  SS5        UR                  [        S5       Vs/ s H  oR                  PM     snS9  U R                  SU	R                  R                  R                   5        U R#                  U	R                  R                  R$                  S   S   S   [        R                  5        U R                  SU	R&                  R                   5        U R                  SU	R                  R(                  R                   5        U R                  SU	R*                  R                   5        U R                  UR                  U	R,                  5        gs  snf s  snf )z9
chordFromElement(): adds an <artic> element held within
r  r   rz   r  r   r  Nr   r   ry  r   r  rX  rZ  r   r|  r  r   )rI   rJ   r   r  r<  r   rL   r   rH   r   r  r   r  r-   rP   r   r  r!   rs  r  r\  r   r   )r%   r   r]  r_  r  r   r  r  r  r  rf   r&   r   s                r'   testUnit2ChordFromElementTest.testUnit2ChordFromElementr  s    }}WS#-FG!02!0A ::1dCdS!0 	 2'KKK$ (EMMVHE"2'BC%-"(?%~~'!-&3&<&<&>%?"&&tT2800a8))UZ[\U]0^U]PQ1K1KU]0^)_L66==HHIl88??NNqQRSTUVW+44	6LOO667L66==HHIL,,778)668M8MN/2  1_s   #I Ic           
     $   [         R                  " SSSS.S9nS Vs/ s H  n[        R                  USSSS	5      PM     nnU H  nUR	                  U5        M     UR	                  [         R                  " [
         S
3SS95        Sn[        R                  " U5      nU R                  XVR                  5        U R                  S[        UR                  5      5        U R                  UR                  S   [        R                  5        gs  snf )zv
noteFromElement(): adds <artic>, <accid>, and <dot> elements held within

(corresponds to testUnit2() with no mocks)
r  r   rz   r  r   r  r6  r   r   r   ry  r  r	  r   r   N)rI   rJ   r   r  r<  r   r   r  r-   r
  r  r   r!   r  r  s          r'    testIntegration2ChordFromElement%Test.testIntegration2ChordFromElement  s     }}WS#-FG!02!0A ::1c3SQ!0 	 2'KKK$ (EMMVHE"2'BCB&&t,7C 4 456f2215}7M7MN2s   #Dc                f   [         R                  " SSSSSSS[        SS	S
0S9nS V	s/ s H  n	[        R	                  U	SSSS5      PM     n
n	U
 H  nUR                  U5        M     SUl        SUl        [        R                  " 5       nXl        / Ul        S/Ul        SUl        [        R                  " US5      nU R                  X5        UR                  SS5        UR                  [        S5       Vs/ s H  oR                  PM     snS9  U R                  UR                  UR                  5        UR                  R                   R                  S/5        U R                  SUR"                  5        U R                  SUR$                  5        UR                  XS5        gs  sn	f s  snf )zS
chordFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle
r  r  r   rW  rz   r   ry  r}  r   r~  r   r  Nr   r  rX  r  r  r  rZ  r   r|  r  )rI   rJ   r   r   r  r<  rL   r   rH   r   r  r-   rP   r   r   r   r\  r  r   )r%   r  r  r  r   r]  r_  r  r   r  r  r  r  r&   r   s                  r'   testUnit3ChordFromElementTest.testUnit3ChordFromElement  s    }}WeS&#wPW.4eUD.J K "12!0A ::1dCdS!0 	 2'KKK$ (%-"(?%~~'!-%'"&1]"'&&t];.00a8))UZ[\U]0^U]PQ1K1KU]0^)_)668M8MN""))AA;-P0<#3#34((]K+2  1_s   #F)8F.c                |   [         R                  " SSSSSSS[        SS	S
0S9nS Vs/ s H  n[        R	                  USSSS5      PM     nnU H  nUR                  U5        M     Sn[        R                  " U5      nU R                  XVR                  5        U R                  S[        UR                  5      5        U R                  UR                  S   [        R                  5        U R                  SUR                  5        U R                  [        R                   " S5      UR                  5        gs  snf )z~
noteFromElement(): adds @xml:id, @artic, and @tie attributes, and the slurBundle

(corresponds to testUnit3() with no mocks)
r  r  r   rW  rz   r   ry  r  r   r~  r   r  r6  r   r   r	  r   r   r  N)rI   rJ   r   r   r  r<  r   r  r-   r
  r  r   r!   r  r  r   r  r  s          r'    testIntegration3ChordFromElement%Test.testIntegration3ChordFromElement  s    }}WeS&#wPW.4j%.O P "12!0A ::1c3SQ!0 	 2'KKK$ (B&&t,7C 4 456f2215}7M7MNVYY/)6::62s   #D9c           
     b   [         R                  " SSSSSSS.S9nS Vs/ s H  n[        R                  USSS	S5      PM     nnU H  n	UR	                  U	5        M     S
Ul        [        R                  " [        R                  S9Ul        SUR
                  l
        [        R                  " 5       n
Xl        / Ul        SUl        UR
                  n[        R                  " US5      nU R                  X5        UR                  SS5        UR                  [        S5       Vs/ s H  oR
                  PM     snS9  U R                  UR
                  U
R                  5        UR                  X5        U R                  SU
R                   R"                  R$                  5        gs  snf s  snf )z4
chordFromElement(): adds tuplet-related attributes
r  r   r  r  r  r  r  r  r  r   r  Nr   r  rB   r  tupletifiedr  rZ  r   r|  r  )rI   rJ   r   r  r<  rL   r   rH   r   r  r  r   r  r-   rP   r   r  r  r  )r%   rT   r   r]  r_  r  r   r  r  r  r  rf   r&   r   s                 r'   testUnit4ChordFromElementTest.testUnit4ChordFromElement  s    }}WS#BEAHU\.^ _ "12!0A ::1dCdS!0 	 2'KKK$ (%-"(,@Q@Q(R%-6%%*~~'!-%'""/
**&&t];*00a8))UZ[\U]0^U]PQ1K1KU]0^)_)668M8MN**<>L..33>>?)2" 1_s   #F'%F,c           
        [         R                  " SSSSSSS.S9nS Vs/ s H  n[        R                  USSS	S
5      PM     nnU H  nUR	                  U5        M     Sn[
        R                  " U5      nU R                  XVR                  5        U R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  5        gs  snf )z_
noteFromElement(): adds tuplet-related attributes

(corresponds to testUnit4() with no mocks)
r  r   r  r  r  r   r  r6  r   r   zUChord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} QuarterN)rI   rJ   r   r  r<  r   r  r-   r
  r  r  r  r  s          r'    testIntegration4ChordFromElement%Test.testIntegration4ChordFromElement  s     }}WS#BEAHU\.^ _ "12!0A ::1c3SQ!0 	 2'KKK$ (; &&t,7f112f556&"8"892s   #C'c           
        [         R                  " SSSSS.S9nS Vs/ s H  n[        R                  USS	S
S5      PM     nnU H  n	UR	                  U	5        M     SUl        [        R                  " [        R                  S9Ul        SUR
                  l
        [        R                  " 5       n
Xl        / Ul        U
n[        R                  " US5      nU R                  X5        UR                  SS5        UR                  [        S5       Vs/ s H  oR
                  PM     snS9  U R                  UR
                  U
R                  5        U
R                   R"                  R                  SS5        gs  snf s  snf )za
chordFromElement(): test @grace and @m21Beam when the duration does require
adjusting the beams
r  r  r  r  r  r  r  r   r  Nr   r   r  rB   r  r  r  r   r|  r  )rI   rJ   r   r  r<  rL   r   rH   r   r  r  r   r  r-   rP   r   r  r  )r%   r  r   r]  r_  r  r   r  r  r  r  rf   r&   r   s                 r'   testUnit5ChordFromElementTest.testUnit5ChordFromElement  sR    }}WTgX]-^_!02!0A ::1dCdS!0 	 2'KKK$ (%-"!%9J9J!K	&,	#~~'!-%'"&&t];*00q9))UZ[\U]0^U]PQ1K1KU]0^)_//1F1FG77H%2  1_s   #E9E>c           
     H   [         R                  " SSSSS.S9nS Vs/ s H  n[        R                  USS	S
S5      PM     nnU H  nUR	                  U5        M     Sn[
        R                  " U5      nU R                  XVR                  5        U R                  SUR                  5        U R                  SUR                  R                  5        U R                  SUR                  R                  S   R                  5        U R                  SUR                  R                  S   R                  5        U R                  SUR                  R                  S   R                  5        U R                  SUR                  R                  S   R                  5        gs  snf )z
noteFromElement(): @grace and @m21Beam when the duration does require adjusting the beams

(corresponds to testUnit5() with no mocks)
r  r  r  r  r$  r   r  r6  r   r   r   zRChord {C-natural in octave 4 | E-natural in octave 4 | G-natural in octave 4} 16thr  r  r   r   r{  N)rI   rJ   r   r  r<  r   r  r-   r
  ri  r   r  r  r  r>  r  s          r'    testIntegration5ChordFromElement%Test.testIntegration5ChordFromElement;  sY    }}WTgX]-^_!02!0A ::1c3SQ!0 	 2'KKK$ (8 &&t,7f223!5!56FLL2215<<=&,,"8"8";"@"@AFLL2215<<=&,,"8"8";"@"@A2s   #Fzmusic21.clef.clefFromStringzmusic21.clef.PercussionClefzmusic21.clef.TabClefc                0  ^	 [         R                  " 5       n[         R                  " S5      [         R                  " S5      [         R                  " S5      [         R                  " S5      [         R                  " S5      [         R                  " S5      /nUR                  [	        S5       Vs/ s H  n[         R
                  PM     sn5        / SQm	U	4S jUR                  l        [         R                  " SS	9Ul        UR                  n[        R                  " U5      nU R                  Xx5        U R                  XTR                  R                  5        U R                  S
UR                  5        U R                  S
UR                  5        gs  snf )z
clefFromElement(): all the elements that go in clef.clefFromString()...
                   'shape', 'line', 'dis', and 'dis.place'
(mostly-unit test; only mock out clef and the ElementTree.Element)
shapeliner  	dis.placer   )theClefShaper.  r.  rS  r   r  c                 8   > T(       a  TR                  S5      $ S $ r  r  r%  elemGetReturnss    r'   r'  0Test.testUnit1aClefFromElement.<locals>.<lambda>h      ~/A/A!/D/`\`/`r*   zclefFromString()r  r   N)r   rH   rr  r\  r   r  r|   r+  rL   r   clefFromElementr-   r   rs  r  
r%   mockTabClefmockPercClefmockClefFromStringr   expectedGetOrderr   rf   r&   r1  s
            @r'   testUnit1aClefFromElementTest.testUnit1aClefFromElementY  s    ~~ IIg.		'0BDIIgDV IIf-tyy/?;AWY58 <8a8 <=\`*...>P*Q'%22%%d+* 	  !1883J3JKK223L334 !=s   /Fc                  ^	 [         R                  " 5       n[         R                  " S5      /nUR                  [	        S5       Vs/ s H  n[         R
                  PM     sn5        S/m	U	4S jUR                  l        [         R                  " SS9Ul        UR                  n[        R                  " U5      nU R                  Xx5        U R                  SUR                  5        U R                  XTR                  R                  5        U R                  SUR                  5        U R                  SUR                  5        gs  snf )	zA
clefFromElement(): same as testUnit1a() but with 'perc' "shape"
r+  r   percc                 8   > T(       a  TR                  S5      $ S $ r  r  r0  s    r'   r'  0Test.testUnit1bClefFromElement.<locals>.<lambda>  r3  r*   PercussionClef()r  r   Nr   rH   rr  r\  r   r  r|   r+  rL   r   r4  r-   r  r   rs  r5  s
            @r'   testUnit1bClefFromElementTest.testUnit1bClefFromElementu  s     ~~ IIg./58 <8a8 <= `$(NN8J$K!,,%%d+*.99:  !1883J3JKK223L334 !=s   Ec                  ^	 [         R                  " 5       n[         R                  " S5      [         R                  " S5      /nUR                  [	        S5       Vs/ s H  n[         R
                  PM     sn5        SS/m	U	4S jUR                  l        [         R                  " SS9Ul        UR                  n[        R                  " U5      nU R                  Xx5        U R                  SUR                  5        U R                  XTR                  R                  5        U R                  SUR                  5        U R                  SUR                  5        gs  snf )	z@
clefFromElement(): same as testUnit1c() but with 'TAB' "shape"
r+  r   TABc                 8   > T(       a  TR                  S5      $ S $ r  r  r0  s    r'   r'  0Test.testUnit1cClefFromElement.<locals>.<lambda>  r3  r*   r@  r  r   NrA  r5  s
            @r'   testUnit1cClefFromElementTest.testUnit1cClefFromElement  s    ~~ IIg.		'0BC58 <8a8 <=`$(NN8J$K!++%%d+*.99:  !1883J3JKK223L334 !=s   Ec                    [         R                  " S5      nSSSSS.nU H  nUR                  X2U   5        M     [        R                  n[
        R                  " U5      nU R                  XER                  5        g)z
clefFromElement(): all the elements that go in clef.clefFromString()...
                   'shape', 'line', 'dis', and 'dis.place'
(corresponds to testUnit1a, with real objects)
r
   GrS  r   r  )r+  r,  r  r-  N)	rI   rJ   setr
   Treble8vaClefr   r4  r-   	__class__r%   clefElemclefAttribseachKeyexpectedClassr&   s         r'    testIntegration1aClefFromElement%Test.testIntegration1aClefFromElement  sj     ==( #S7S"GLLg"67 #**%%h/(8(89r*   c                    [         R                  " S5      nSS0nU H  nUR                  X2U   5        M     [        R                  n[
        R                  " U5      nU R                  XER                  5        g)z@
PercussionClef

(corresponds to testUnit1b, with real objects)
r
   r+  r=  N)	rI   rJ   rL  r
   PercussionClefr   r4  r-   rN  rO  s         r'    testIntegration1bClefFromElement%Test.testIntegration1bClefFromElement  sf     ==('"GLLg"67 #++%%h/(8(89r*   c                    [         R                  " S5      nSS0nU H  nUR                  X2U   5        M     [        R                  n[
        R                  " U5      nU R                  XER                  5        g)z9
TabClef

(corresponds to testUnit1c, with real objects)
r
   r+  rE  N)	rI   rJ   rL  r
   TabClefr   r4  r-   rN  rO  s         r'    testIntegration1cClefFromElement%Test.testIntegration1cClefFromElement  sd     ==(&"GLLg"67 #%%h/(8(89r*   c                2  ^	 [         R                  " 5       n[         R                  " S5      [         R                  " [        5      [         R                  " [        5      /nUR	                  [        S5       Vs/ s H  n[         R                  PM     sn5        / SQm	U	4S jUR                  l        [         R                  " SS9Ul	        UR                  n[        R                  " U5      nU R                  Xx5        U R                  SUR                  5        U R                  XTR                  R                  5        U R                  SUR                  5        U R                  SUR                  5        U R                  SUR                   5        g	s  snf )
z0
clefFromElement(): adds the "xml:id" attribute
r+  r   )r=  theXMLIDr_  c                 8   > T(       a  TR                  S5      $ S $ r  r  r0  s    r'   r'  /Test.testUnit2ClefFromElement.<locals>.<lambda>  r3  r*   r@  r  r   r_  N)r   rH   rr  r   r\  r   r  r|   r+  rL   r   r4  r-   r  r   rs  r  r5  s
            @r'   testUnit2ClefFromElementTest.testUnit2ClefFromElement  s    ~~ IIg.		&0A499VCTU58 <8a8 <=9`$(NN8J$K!,,%%d+*.99:  !1883J3JKK223L334VYY/ !=s   8Fzmusic21.stream.Voicezmusic21.mei.base._guessTupletsc                  ^^ Sn[         R                  " 5       nXD/mU4S jUR                  l        [         R                  " S5      [         R                  " S5      /n[         R                  " SS9[         R                  " SS9[         R                  " SS9/n[
        R                   S3US	   l        [
        R                   S3US
   l        [
        R                   S3US   l        [         R                  " US9Ul        [         R                  " US	   S5      [         R                  " US   S5      /nSS/mU4S jUl        S Ul        S	SK	n	S	SK
Jn
  U	R                  5          U	R                  SU
R                  S9  [         R                  " [        R                   " 5       SS9Ul        SSS5        [         R                  " TS	   5      [         R                  " TS
   5      /n[
        R$                  " U5      nUR                  R'                  S5        U R)                  UR"                  U5        U R+                  XR,                  5        UR'                  5         U R+                  UUR"                  R.                  R,                  5        UR"                  R0                  R'                  5         U R)                  XLR2                  5        U R+                  XeR                  R,                  5        g! , (       d  f       GNN= f)a_  
layerFromElement(): basic functionality (i.e., that the tag-name-to-converter-function
                    mapping works; that tags not in the mapping are ignored; and that a
                    Voice object is returned. And "id" is set from the @n attribute.
(mostly-unit test; only mock noteFromElement, _guessTuplets, and the ElementTree.Element)
z@n valuec                 8   > T(       a  TR                  S5      $ S $ r  r  r0  s    r'   r'  1Test.testUnit1aLayerFromElement.<locals>.<lambda>  r3  r*   r6  note1r  	imaginarynote2r   r   r   r{  r{   NmockNoteFromElement return 1mockNoteFromElement return 2c                 &   > TR                  S5      $ r  r  r%  mockNFEreturnss    r'   r'  rf        .:L:LQ:Or*   c                    U $ r"  r#  r  s    r'   r'  rf        Ar*   exceptions21ignorecategoryr  rC   rb   *)r   rH   r|   r+  rr  r   r   r.   iterfindwarningsmusic21rt  catch_warningssimplefilterMusic21DeprecationWarningr   rM   rL   layerFromElementrP   r-   r   rs  
coreAppendcoreElementsChangedr  )r%   mockTuplets	mockVoicemockNoteFromElementtheNAttributer   r9  iterfindReturnexpectedMNFEOrderr{  rt  expectedAppendCallsr&   r1  rn  s                @@r'   testUnit1aLayerFromElementTest.testUnit1aLayerFromElement  sU    #~~'7` IIcNDIIcN;..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNC!YY~a'8$?!YY~a'8$?A8:XY*O'"-($$&!!(\5[5[!\%)^^V]]_SZ%[I" '  $yy):;TYY~VWGX=YZ&&t,--c2//8  !24V4VW))+  !4!*!7!7!B!B!Q!Q	S22JJL		2  !1883J3JK '&s   (AK77
Lc                  ^ [         R                  " 5       n[         R                  " SS9[         R                  " SS9[         R                  " SS9/n[        R                   S3US   l        [        R                   S3US   l        [        R                   S3US   l        [         R                  " US	9Ul        [         R                  " US   S
5      [         R                  " US   S
5      /nSS/mU4S jUl        S Ul        SS
KnSSK	J
n  UR                  5          UR                  SUR                  S9  [         R                  " [        R                  " 5       SS9Ul        S
S
S
5        [         R                  " TS   5      [         R                  " TS   5      /n	Sn
[        R"                  " XJ5      nUR
                  R%                  S5        U R'                  UR                   U5        U R)                  XcR*                  5        UR%                  5         U R)                  U	UR                   R,                  R*                  5        UR                   R.                  R%                  5         U R'                  XR0                  5        U R'                  SUR2                  R4                  5        g
! , (       d  f       GNQ= f)z9
Same as testUnit1a() *but* with ``overrideN`` provided.
rg  r  rh  ri  r   r   r   r{  r{   Nrj  rk  c                 &   > TR                  S5      $ r  r  rm  s    r'   r'  1Test.testUnit1bLayerFromElement.<locals>.<lambda>4  ro  r*   c                    U $ r"  r#  rq  s    r'   r'  r  5  rr  r*   rs  ru  rv  r  rx  z	my own @nry  )r   rH   r   r   r.   rz  rr  r+  r{  r|  rt  r}  r~  r  r   rM   rL   r  rP   r-   r   rs  r  r  r  r|   r  )r%   r  r  r  r   r  r  r{  rt  r  	overrideNr&   rn  s               @r'   testUnit1bLayerFromElementTest.testUnit1bLayerFromElement!  s'    ~~..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNC!YY~a'8$?!YY~a'8$?A8:XY*O'"-($$&!!(\5[5[!\%)^^V]]_SZ%[I" '  $yy):;TYY~VWGX=YZ	&&t7--c2//8  !24V4VW))+  !4!*!7!7!B!B!Q!Q	S22JJLII.DHH//0! '&s   !AJ33
Kc                  ^	 [         R                  " 5       nSUR                  l        [         R                  " SS9[         R                  " SS9[         R                  " SS9/n[        R
                   S3US   l        [        R
                   S3US   l        [        R
                   S3US	   l        [         R                  " US
9Ul        / SQm	U	4S jUl        SSK	nSSK
Jn  UR                  5          UR                  SUR                  S9  [         R                  " [        R                   " 5       SS9Ul        SSS5        U R#                  [        R$                  [        R&                  U5         [        R&                  " U5        g! , (       d  f       NU= f! [        R$                   a7  nU R)                  [        R*                  UR,                  S   5         SnAgSnAff = f)z9
Same as testUnit1a() *but* without ``overrideN`` or @n.
Nrg  r  rh  ri  r   r   r   r{  r{   )rj  rk  rj  rk  c                 &   > TR                  S5      $ r  r  )r%  mockNFEReturnss    r'   r'  1Test.testUnit1cLayerFromElement.<locals>.<lambda>c  ro  r*   rs  ru  rv  r  rx  )r   rH   r|   rL   r   r   r.   rz  r+  r{  r|  rt  r}  r~  r  r   rM   r3   MeiAttributeErrorr  r-   _MISSING_VOICE_IDr6   )
r%   r  r  r  r   r  r{  rt  maErrorr  s
            @r'   testUnit1cLayerFromElementTest.testUnit1cLayerFromElementJ  st    ~~ $..g6..k:..g68 $(;;-t 4q#';;-y 9q#';;-t 4qNCZ*O'($$&!!(\5[5[!\%)^^V]]_SZ%[I" ' 	$00$2G2GN	F!!$' '& %% 	FT33W\\!_EE	Fs%   6AF6F 
FG)2-G$$G)c                B   Sn[         R                  " U5      n[        R                  " U5      nU R	                  S[        U5      5        U R	                  SUR                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  S	US   R                  5        g
)a*  
layerFromElement(): basic functionality (i.e., that the tag-name-to-converter-function
                    mapping works; that tags not in the mapping are ignored; and that a
                    Voice object is returned. And "xml:id" is set.
(corresponds to testUnit1a() but without mock objects)
a  <layer n="so voice ID" xmlns="http://www.music-encoding.org/ns/mei">
                          <note pname="F" oct="2" dur="4" />
                          <note pname="E" oct="2" accid="f" dur="4" />
                          <imaginary awesome="true" />
                      </layer>r{  so voice IDr  r   rZ  r   F2E-2N
rI   r2  r   r  r-   r  r  offsetri  rh  r%   inputXMLr   r&   s       r'   !testIntegration1aLayerFromElement&Test.testIntegration1aLayerFromElementr  s    "
 )&&t,CK(		2fQi../fQi../fQi556fQi556vay778q	 8 89r*   c                D   Sn[         R                  " U5      n[        R                  " US5      nU R	                  S[        U5      5        U R	                  SUR                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  SUS   R                  5        U R	                  S	US   R                  5        g
)z8
(corresponds to testUnit1b() but without mock objects)
  <layer xmlns="http://www.music-encoding.org/ns/mei">
                          <note pname="F" oct="2" dur="4" />
                          <note pname="E" oct="2" accid="f" dur="4" />
                          <imaginary awesome="true" />
                      </layer>r  r{  r  r   rZ  r   r  r  Nr  r  s       r'   !testIntegration1bLayerFromElement&Test.testIntegration1bLayerFromElement  s    "
 )&&t];CK(		2fQi../fQi../fQi556fQi556vay778q	 8 89r*   c                \   Sn[         R                  " U5      nU R                  [        R                  [        R
                  U5         [        R
                  " U5        g! [        R                   a7  nU R                  [        R                  UR                  S   5         SnAgSnAff = f)z8
(corresponds to testUnit1c() but without mock objects)
r  r   N)	rI   r2  r3   r   r  r  r-   r  r6   )r%   r  r   r  s       r'   !testIntegration1cLayerFromElement&Test.testIntegration1cLayerFromElement  s    "
 )$00$2G2GN	F!!$'%% 	FT33W\\!_EE	Fs   	A   B+4-B&&B+z!music21.mei.base.layerFromElementc           
       ^ [         R                  " 5       n[         R                  " SS9[         R                  " SS9[         R                  " SS9/n[        R                   S3US   l        [        R                   S3US   l        [        R                   S3US   l        [         R                  " US	9Ul        [        [        U5      5       Vs/ s H'  n[         R                  " X4   [        US-   5      S
S9PM)     nn[        [        U5      5       Vs/ s H  nSPM     snmU4S jUl
        [        [        U5      5       Vs/ s H  nSPM     nn[        R                  " U5      nUR
                  R                  S5        U R                  Xg5        U R                  XQR                  5        g
s  snf s  snf s  snf )z
staffFromElement(): basic functionality (i.e., that layerFromElement() is called with the
                    right arguments, and with properly-incrementing "id" attributes
(mostly-unit test; only mock noteFromElement and the ElementTree.Element)
layer1r  layer2layer3layerr   r   r{  r{   Nr#   zmockLayerFromElement return %ic                &   > TR                  S5      $ r  r  )r  r&  r#   mockLFEReturnss      r'   r'  0Test.testUnit1StaffFromElement.<locals>.<lambda>  s    ^%7%7%:r*   ry  )r   rH   r   r   r.   rz  r   r  rr  r   r+  staffFromElementrP   r-   r   rs  )	r%   mockLayerFromElementr   findallReturnr   expectedMLFEOrderrf   r&   r  s	           @r'   testUnit1StaffFromElementTest.testUnit1StaffFromElement  s~    ~~X6X6X68 #'++e4a"&++e4a"&++e4aMB ',C,>&?A&? "YY}'7QUPTU&? 	 ADI#mJ\D]^D]q:D]^: 	(>CCDV>WX>W4>WX&&t,--c2*  !24W4WXA^ Ys   .F4F9F>c                   Sn[         R                  " U5      n[        R                  " U5      nU R	                  S[        U5      5        [        [        U5      5       Hb  nU R	                  S[        X4   5      5        U R	                  SX4   S   R                  5        U R	                  SX4   S   R                  5        Md     U R	                  SUS   R                  5        U R	                  SUS   S   R                  5        U R	                  S	US   R                  5        U R	                  S
US   S   R                  5        U R	                  SUS   R                  5        U R	                  SUS   S   R                  5        g)z
staffFromElement(): basic functionality (i.e., that layerFromElement() is called with the
                    right arguments, and with properly-incrementing "id" attributes
(corresponds to testUnit1() but without mock objects)
a  <staff xmlns="http://www.music-encoding.org/ns/mei">
                          <layer>
                              <note pname="F" oct="2" dur="4" />
                          </layer>
                          <layer>
                              <note pname="A" oct="2" dur="4" />
                          </layer>
                          <layer>
                              <note pname="C" oct="2" dur="4" />
                          </layer>
                      </staff>r|  r   r  r   rZ  rz   r  rS  A2r   r{  C2N)rI   r2  r   r  r-   r  r   r  ri  r  rh  )r%   r  r   r&   r   s        r'    testIntegration1StaffFromElement%Test.testIntegration1StaffFromElement  sD   
" )&&t,CK(s6{#AQFI/S&)A,"5"56S&)A,"<"<= $
 	fQill+vay|::;fQill+vay|::;fQill+vay|::;r*   z$music21.mei.base.instrDefFromElementz"music21.mei.base._timeSigFromAttrsz!music21.mei.base._keySigFromAttrsz music21.mei.base.clefFromElementz(music21.mei.base._transpositionFromAttrsc                p   [         R                  " [         S3SSSSSSSSS	S
S.
S9n[         R                  " [         S3SSSS.S9nUR                  U5        [        R
                  " S5      nXl        SUl        SUl        SUl        SUl        UR                  UR                  UR                  UR                  S.n	SSSSUR                  4/n
[        R                  " U5      nU R                  X5        UR                  U5        UR                  U5        UR                  U5        UR                  U5        U
 H   u  pU R                  [        X5      U5        M"     UR                  [        R                  5        UR                  S   S   S   nU R                  SUR                  5        U R                  SUR!                  S5      5        U R                  SUR!                  S5      5        U R                  SUR!                  S5      5        U R                  SUR!                  S 5      5        g!)"a'  
staffDefFromElement(): proper handling of the following attributes (see function docstring
    for more information).

@label, @label.abbr  @n, @key.accid, @key.mode, @key.pname, @key.sig, @meter.count,
@meter.unit, @clef.shape, @clef.line, @clef.dis, @clef.dis.place, @trans.diat, @trans.demi
staffDefFr   cdcdp	the labelthe l.rz   rK  r}  

clef.shape	clef.linezclef.diszclef.dis.placelabelz
label.abbrr6  r   r   r   r   instrDef71Clarinetzmidi.channelmidi.instrnummidi.instrnamemock instrumentmockTime returnmockKey returnmockClef returnmockTrans returnr   r   r   r
   partNamer  partAbbreviationr  partIdrz   transpositionr   r
   r+  r,  r  r-  N)rI   rJ   r   r<  r   rH   rL   r   staffDefFromElementassertDictEqualrP   r-   getattrr  rs  r.   r|   )r%   r  mockClefmockKeymockTime	mockInstrr   theInstrDeftheMockInstrumentrf   expectedAttrsr&   attrName	attrValuemockClefArgs                  r'   ,testUnit1StaffFromElementStaffDefFromElement1Test.testUnit1StaffFromElementStaffDefFromElement  s    }}xx036SVZ7<{3;#VY25U%LM
 mmvhh$7<?RV>H,JK 	K  NN+<=!2 1/ 1!3	"+"8"8%22"//$113
 37()9+A+ABD ))$/ 	X.))+6((.''-))$/#0HW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r*   c                   [         R                  " [         S3SSSSSSSS	S
S.	S9n[         R                  " [         S3SSSS.S9nUR                  U5        [        R
                  " U5      nU R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  SUS   R                   5        U R                  SUS   R"                  5        U R                  SUS   R$                  5        U R                  SUS   R&                  5        g)zH
staffDefFromElement(): corresponds to testUnit1() without mock objects
r  rK  rS  r   r   r   r   majorr   r   )	r  r  r6  r   r   r   r   r   r   r   r  rz   r  r  r  r   r   r   r
   r   r   NrI   rJ   r   r<  r   r  r!   r   r  r   TimeSignaturer   r   r
   
TrebleClefr-   r  r   r   r   r%   r   r  r&   s       r'   !testIntegration1aStaffFromElement&Test.testIntegration1aStaffFromElement;	  sT   
 }}xx036St47sWZ18\`%bc mmvhh$7<?RV>H,JK 	K  ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r*   c                F   [         R                  " [         S3SSSSSSSS	.S
9n[         R                  " [         S3SSSS.S
9nUR                  U5        UR                  [         R                  " [         S3SSS.S
95        [        R
                  " U5      nU R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  SUS   R                   5        U R                  SUS   R"                  5        U R                  SUS   R$                  5        U R                  SUS   R&                  5        g)zB
staffDefFromElement(): testIntegration1() with <clef> tag inside
r  r   r   r   r   r  r   r   )r6  r   r   r   r   r   r   r   r  rz   r  r  r  r
   rK  rS  )r+  r,  r   r   r   r   r   Nr  r  s       r'   !testIntegration1bStaffFromElement&Test.testIntegration1bStaffFromElementW	  ss   
 }}xx0*.sRU0318\`%bc mmvhh$7<?RV>H,JK 	K EMMVHD/CQT:UVW ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r*   zmusic21.instrument.fromStringc                $   [         R                  " [         S3SSSSSSSSS	S
S.
S9n[        R                  " S5      nXl        SUl        SUl        SUl        SUl        UR
                  UR
                  UR
                  UR
                  S.n	SSSSUR
                  4/n
[        R                  " U5      nU R                  X5        U R                  SUR                  5        UR                  U5        UR                  U5        UR                  U5        U
 H   u  pU R                  [        X5      U5        M"     UR                  [        R                  5        UR                  S   S   S   nU R                  SUR                  5        U R                  SUR!                  S5      5        U R                  SUR!                  S5      5        U R                  SUR!                  S5      5        U R                  SUR!                  S5      5        g)z~
staffDefFromElement(): same as testUnit1() *but* there's no <instrDef> so we have to use
    music21.instrument.fromString()
r  r  r   r  r  r  r  rz   rK  r}  r  r   r  r  r  r  r  r  r  r  r  r  r   r
   r+  r,  r  r-  N)rI   rJ   r   r   rH   rL   r   r  r  r-   r  rP   r  r  rs  r.   r|   )r%   r  r  r  r  r  mockFromStringr   r  rf   r  r&   r  r  r  s                  r'   testUnit2StaffFromElementTest.testUnit2StaffFromElements	  s    }}xx036SVZ7<{3;#VY25U%LM
 !NN+<=&7# 1/ 1!3	"0"="=%22"//$113
 37()9+A+ABD ))$/ 	X.I001((.''-))$/#0HW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r*   c                   [         R                  " [         S3SSSSSSSS	S
SS.
S9n[        R                  " U5      nU R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  SUS   R                  5        U R                  SUS   R                   5        U R                  SUS   R"                  5        U R                  SUS   R$                  5        g)zL
staffDefFromElement(): corresponds to testUnit2() but without mock objects
r  r   rS  rK  r   r  r   r   r   r   clarinet)
r6  r  r  r   r   r   r   r   r   r  r   r   r   r   r
   r   r   N)rI   rJ   r   r   r  r!   r   r  r   r  r   r   r
   r  r-   r  r   r   r   r   s      r'    testIntegration2StaffFromElement%Test.testIntegration2StaffFromElement	  s!   
 }}xx0*.SPS0318\`47sU_%ab ))$/ 	f\2J4G4GHfWou/B/BCfUmS-=-=>fVndoo>vl3::;w ; ;<&-"4"45F5M001r*   zmusic21.instrument.Instrumentc                H   [         R                  " [         S3SSSSSSSSS	S
S.
S9n[        R                  " S5      n	[
        R                  Ul        Xl        SUl        SUl        SUl        SUl        UR                  UR                  UR                  UR                  S.n
SUR                  4/n[        R                  " U5      nU R                  X5        U R                  SUR                  5        UR                  U5        UR                  U5        UR                  U5        U H   u  pU R                  [        X5      U5        M"     UR                  [        R                   5        UR"                  S   S   S   nU R                  SUR$                  5        U R                  SUR'                  S5      5        U R                  SUR'                  S5      5        U R                  SUR'                  S5      5        U R                  SUR'                  S5      5        g)z
staffDefFromElement(): same as testUnit1() *but* there's no <instrDef> so we have to use
  music21.instrument.fromString() *and* that raises an InstrumentException.
r  r  r   r  r  r  r  rz   rK  r}  r  r   r  r  r  r  r  r  r  r   r
   r+  r,  r  r-  N)rI   rJ   r   r   rH   r   InstrumentExceptionr+  rL   r   r  r  r-   r  rP   r  r  rs  r.   r|   )r%   r  r  r  r  r  r  mockInstrInitr   r  rf   r  r&   r  r  r  s                   r'   testUnit3StaffFromElementTest.testUnit3StaffFromElement	  s     }}xx036SVZ7<{3;#VY25U%LM
 !NN+<=%/%C%C"%6" 1/ 1!3	"/"<"<%22"//$113 *9+A+ABC ))$/ 	X.I001((.''-))$/#0HW%6A9M $1 	((2--a03A61koog67koof56{u56 <=r*   c                   [         R                  " [         S3SSSSSSSS	S
S.	S9n[        R                  " U5      nU R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  US   [        R                  5        U R                  SUS   R                  5        U R                  SUS   R                   5        U R                  SUS   R"                  5        U R                  SUS   R$                  R&                  5        g)L
staffDefFromElement(): corresponds to testUnit3() but without mock objects
r  r   rS  rK  r   r  r   r   r   r   )	r6  r  r  r   r   r   r   r   r   r   r   r   r   r
   r   r   r   N)rI   rJ   r   r   r  r!   r   
Instrumentr   r  r   r   r
   r  r-   r   r   r   r  r   r   s      r'    testIntegration3StaffFromElement%Test.testIntegration3StaffFromElement	  s$   
 }}xx0*.SPS0318\`47s%LM ))$/ 	f\2J4I4IJfWou/B/BCfUmS-=-=>fVndoo>w ; ;<&-"4"45F5M001| 4 B B O OPr*   c                    [         R                  " [         S3SSS.S9nSUl        [        R
                  Ul        SUR                  0n	[        R                  " U5      n
U R                  X5        g)	z/
staffDefFromElement(): only specifies a meter
r  rz   r   r   r   r  r   N)
rI   rJ   r   rL   r   r  r+  r   r  r  )r%   r  r  r  r  r  r  r  r   rf   r&   s              r'   testUnit4StaffFromElementTest.testUnit4StaffFromElement
  so     }}xx0PS:U V 1%/%C%C"X223 ))$/ 	X.r*   c                    [         R                  " [         S3SSS.S9n[        R                  " U5      nU R                  US   [        R                  5        U R                  SUS   R                  5        g)	r  r  rz   r   r   r   r   z1/3N)
rI   rJ   r   r   r  r!   r   r  r-   r   r   s      r'    testIntegration4StaffFromElement%Test.testIntegration4StaffFromElement1
  so    
 }}xx0PS:U V ))$/ 	fWou/B/BCw ; ;<r*   z$music21.mei.base.staffDefFromElementc           
     *   [         R                  " S5      n[        S5       Vs/ s H*  n[         R                  " [         S3S[	        U5      0S9PM,     nnU H  nUR                  U5        M     S Ul        [        S5       Vs0 s H  n[	        U5      SU 3_M     nn[        R                  " US0 5      nU R                  Xg5        U R                  [        U5      UR                  5        U H  nUR                  US5        M     gs  snf s  snf )	z>
staffGrpFromElement(): it's not a very complicated function!
staffGrpr   r  r6  r   c                *    SU R                  S5       3$ )N
processed r6  )r|   )r  unused_ys     r'   r'  8Test.testStaffGrpUnit1StaffFromElement.<locals>.<lambda>J
  s    :aeeCj\9Rr*   r  N)rI   rJ   r   r   r   r<  r+  r   staffGrpFromElementr-   r  r  r  )r%   mockStaffDefFEr   r6  
innerElemseachElemrf   r&   s           r'   !testStaffGrpUnit1StaffFromElement&Test.testStaffGrpUnit1StaffFromElement@
  s    
 }}Z(MRSTXWMU mmvhh$7c!fNMU 	 W"HKK! #%R"6;Ah?hCFj,,h?))$b9*Z.*C*CD"H**8T: #W
 @s   1DDc           
        [         R                  " S5      n[        S5       Vs/ s H5  n[         R                  " [         S3[	        US-   5      SUS-    S3S.S9PM7     nnU H  nUR                  U5        M     S	[        R                  " S
5      0S	[        R                  " S5      0S	[        R                  " S5      0S	[        R                  " S5      0S.n[        R                  " US5      nU R                  XV5        gs  snf )zH
staffGrpFromElement(): with <staffDef> directly inside this <staffGrp>
r  r   r  r   r  r   r6  r   r   r   r   r  B-E-A-rz   rS  r   r   NrI   rJ   r   r   r   r<  r   r   r   r  r  )r%   r   r6  r  r  rf   r&   s          r'    testStaffGrpInt1StaffFromElement%Test.testStaffGrpInt1StaffFromElementT
  s     }}Z(  %Qx)  (! mmvhh$714QU:;a%{,DE  ( 	 ) #HKK! #.///1
 ))$5X.)s   <Dc           
     n   [         R                  " S5      n[        S5       Vs/ s H5  n[         R                  " [         S3[	        US-   5      SUS-    S3S.S9PM7     nn[         R                  " [         S35      nU H  nUR                  U5        M     UR                  U5        S	[        R                  " S
5      0S	[        R                  " S5      0S	[        R                  " S5      0S	[        R                  " S5      0S.n[        R                  " US5      nU R                  Xg5        gs  snf )zG
staffGrpFromElement(): with <staffDef> embedded in another <staffGrp>
r  r   r  r   r  r   r  r   r   r  r  r   r!  r"  Nr#  )r%   r   r6  r  innerGrpr  rf   r&   s           r'    testStaffGrpInt2StaffFromElement%Test.testStaffGrpInt2StaffFromElementh
  s    }}Z(  %Qx)  (! mmvhh$714QU:;a%{,DE  ( 	 ) ==F88!45"HOOH% #H.///1
 ))$5X.)s   <D2c                   [         R                  " SSSSSS.S9nSUl        S	Ul        UR                  UR                  // S
.n[        R                  " U5      nU R                  XE5        UR                  U5        UR                  U5        g)z
scoreDefFromElement(): proper handling of the following attributes (see function docstring
    for more information).

@meter.count, @meter.unit, @key.accid, @key.mode, @key.pname, @key.sig
r  4sr  r   r   r   r   r   r   r   r  r  )all-part objectswhole-score objectsN)rI   rJ   rL   r   scoreDefFromElementr-   rP   )r%   r  r  r   rf   r&   s         r'   testUnit1ScoreDefFromElement!Test.testUnit1ScoreDefFromElement
  s     }}ZDg@CSV1X Y 1/)1)>)>@T@T(U+-/ ))$/ 	*((.''-r*   c                   [         R                  " SSSSSS.S9n[        R                  " U5      nU R	                  US   S	   [
        R                  5        U R	                  US   S
   [        R                  5        U R                  SUS   S	   R                  5        U R                  SUS   S
   R                  5        U R                  SUS   S
   R                  5        g)zH
scoreDefFromElement(): corresponds to testUnit1() without mock objects
r  r+  r  r   r   r,  r   r-  r   r   r   r   N)rI   rJ   r   r/  r!   r   r  r   r   r-   r   r   r   r   s      r'   #testIntegration1ScoreDefFromElement(Test.testIntegration1ScoreDefFromElement
  s    
 }}ZDg@CSV1X Y ))$/ 	f%78;U=P=PQf%78;S=M=MN'9 :1 = I IJ&);"<Q"?"D"DEF#56q9@@Ar*   z$music21.mei.base.staffGrpFromElementc                   [         R                  " SSSSSS.S9n[         R                  " [         S35      n[         R                  " [         S3S	S
S.S9nUR                  U5        UR                  U5        SUl        SUl        S	SS00Ul        UR                  UR                  // SS0S.n[
        R                  " U5      nU R                  Xx5        UR                  U5        UR                  U5        UR                  US5        g)z:
scoreDefFromElement(): test for a <staffGrp> held within
r  r+  r  r   r   r,  r   r  rz   r  r6  r  r  r  r   z
A clarinet)r-  r.  rz   N)	rI   rJ   r   r<  rL   r   r/  r-   rP   )	r%   mockStaffGrpFEr  r  r   r  r  rf   r&   s	            r'   testUnit2ScoreDefFromElement!Test.testUnit2ScoreDefFromElement
  s    }}ZDg@CSV1X Y==F88!45==F88!4.1J(GI!H 1/'*\<,H&I#)1)>)>@T@T(U+-&57
 ))$/ 	*((.''-..x>r*   c                X   [         R                  " SSSSSS.S9n[         R                  " [         S35      n[         R                  " [         S3S	S
S.S9nUR                  U5        UR                  U5        [        R
                  " U5      nU R                  US   S   [        R                  5        U R                  US   S   [        R                  5        U R                  SUS   S   R                  5        U R                  SUS   S   R                  5        U R                  SUS   S   R                  5        U R                  S	US	   S   R                  5        U R                  S
US	   S   R                   5        U R                  US	   S   ["        R$                  5        g)zH
scoreDefFromElement(): corresponds to testUnit2() without mock objects
r  r+  r  r   r   r,  r   r  rz   r  r6  r-  r   r   r   r   r   N)rI   rJ   r   r<  r   r/  r!   r   r  r   r   r-   r   r   r   r  r  r   r  )r%   r   r  r  r&   s        r'   #testIntegration2ScoreDefFromElement(Test.testIntegration2ScoreDefFromElement
  s   
 }}ZDg@CSV1X Y==F88!45==F88!4.1J(GI!H ))$/ 	f%78;U=P=PQf%78;S=M=MN'9 :1 = I IJ&);"<Q"?"D"DEF#56q9@@AfSk,7>>?VC[%>%G%GHfSk,79L9LMr*   c                   [         R                  " SS9n[        S5       Vs/ s H  n[        R                  " S5      PM     nnSU0nSS/n[         R
                  " US   S5      [         R
                  " US   S5      /n[        R                  " X45      nU R                  XW5        U R                  XaR                  5        gs  snf )zL
_processesEmbeddedElements(): that single m21 objects are handled properly
translator returnr{   r{  r   r   Nr   )
r   rH   r   rI   rJ   rr  r   _processEmbeddedElementsr   rs  )r%   mockTranslatorr   elementsr  rf   expectedCallsr&   s           r'   testUnit1EmbeddedElementsTest.testUnit1EmbeddedElements
  s     5HI388<8aEMM&)8<>*')<=8A;5tyy!d7ST..xA  2  0M0MN =s    Cc                b   [         R                  " SS9n[         R                  " SS/S9n[        R                  " S5      [        R                  " S5      /nXS.n/ SQn[        R
                  " X45      nU R                  XV5        UR                  US	   S
5        UR                  US   S
5        g
)zR
_processesEmbeddedElements(): that iterables of m21 objects are handled properly
r>  r{   
embedded 1
embedded 2r   beam)r   rH  )r>  rF  rG  r   Nr   )r   rH   rI   rJ   r   r?  r   rP   )r%   r@  mockBeamTranslatorrA  r  rf   r&   s          r'   testUnit2EmbeddedElementsTest.testUnit2EmbeddedElements
  s     5HI!^^,9UVMM&)5==+@A)FD..xA  2..x{DA228A;Er*   c                   [         R                  " SS9n[        R                  " S5      [        R                  " S5      /nSU0nSnS/n[        R
                  R                  US   R                  U5      n[        R                  " X4U5      nU R                  Xh5        UR                  US   S5        UR                  R                  U5        g)	zQ
_processesEmbeddedElements(): that un-translated elements are reported properly
r>  r{   r   breamoceanr   r   N)r   rH   rI   rJ   r   _UNPROCESSED_SUBELEMENTr>   r.   r?  r   rP   
printDebug)	r%   rl  r@  rA  r  
callerNamerf   expErrr&   s	            r'   testUnit3EmbeddedElementsTest.testUnit3EmbeddedElements  s    
 5HIMM&)5==+AB>*
'(--44Xa[__jQ..x*M  2..x{DA66v>r*   c                   Sn[         R                  " SUSSS.S9n[        R                  " S5      n[        R                  " S5      n[        R                  " 5       Ul        [        R                  " U/S9Ul        [        R                  " S	5      nS
n[        R                  " X%U5      nU R                  Xg5        UR
                  R                  U5        UR                  R                  U5        g)=
addSlurs(): element with @m21SlurStart is handled correctly
$ae0b1570-451f-4ee9-a136-2094e26a797br   Nm21SlurStart
m21SlurEndslurr   r  	mock slurr{   objectT
rI   rJ   r   rH   addSpannedElementsgetByIdLocalr   addSlursr-   rP   r%   theUUIDr   r#   mockNewSlurobjrf   r&   s           r'   testUnit1AddSlursTest.testUnit1AddSlurs  s     9}}VW;?59-; < ^^M2
nn[1)-)9&"&..{m"L
nnX&t*5*77@&&>>sCr*   c                   Sn[         R                  " SUSSS.S9n[        R                  " 5       n[        R                  " 5       nXl        UR                  U5        [        R                  " SSS9nS	n[        R                  " X%U5      nU R                  Xg5        U R                  U/[        U5      5        U R                  U/[        U5      S
   R                  5       5        g)rV  rW  r   NrX  r   E-7       @ri  Tr   )rI   rJ   r   r$   SluridLocalr<  r   Noter   ra  r-   r   r   getSpannedElements)r%   rc  r   r#   theSlurre  rf   r&   s           r'   testIntegration1AddSlursTest.testIntegration1AddSlurs1  s     9}}VW;?59-; < **,
,,.!'"iiS1t*5*  'D,<=  #Z(8(;(N(N(PQr*   c                   Sn[         R                  " SSUSS.S9n[        R                  " S5      n[        R                  " S5      n[        R                  " 5       Ul        [        R                  " U/S9Ul        [        R                  " S	5      nS
n[        R                  " X%U5      nU R                  Xg5        UR
                  R                  U5        UR                  R                  U5        g)z;
addSlurs(): element with @m21SlurEnd is handled correctly
rW  r   NrX  r   r  r\  r{   r]  Tr^  rb  s           r'   testUnit2AddSlursTest.testUnit2AddSlursF  s     9}}VT;B59-; < ^^M2
nn[1)-)9&"&..{m"L
nnX&t*5*77@&&>>sCr*   zmusic21.spanner.Slurc                *   [         R                  " SSSSS.S9n[        R                  " S5      n[        R                  " S5      Ul        [        R                  " S5      Ul        [        R                  " 5       UR
                  l        [        R                  " S	5      n[        R                  " 5       Ul        [        R                  " U/S
9Ul        [        R                  " S5      nSn[        R                  " X%U5      nU R                  Xg5        UR                  R                  UR
                  5        UR
                  R                  R                  U5        UR                  R                  S5        UR                  R                  U5        g)P
addSlurs(): element with @slur is handled correctly (both an 'i' and 't' slur)
r   N1i 2trX  r   r  zslurBundle.appendr\  zmock new slurr{   r]  TrS  )rI   rJ   r   rH   r<  rL   r_  r`  r   ra  r-   rP   )r%   r  r   r#   rd  re  rf   r&   s           r'   testUnit3AddSlursTest.testUnit3AddSlurs]  s&   
 }}VT;?5<-> ? ^^M2
 NN+>?
 ${ ;37>>3C0nn_5)-)9&"&..{m"L
nnX&t*5*11(2G2GH00HHM77<&&>>sCr*   c                   [         R                  " SSSSS.S9n[        R                  " 5       n[        R                  " 5       nSUl        UR                  U5        [        R                  " SSS	9nS
n[        R                  " XU5      nU R                  XV5        U R                  U[        R                  /[        U5      5        U R!                  [        U5      S   [        R                  5        U R                  U/[        U5      S   R#                  5       5        U R                  U/[        U5      S   R#                  5       5        g)rw  r   Nrx  rX  r   rS  ri  rj  rk  Tr   r   )rI   rJ   r   r$   rl  rm  r<  r   rn  r   ra  r-   r   r   r  r   r!   ro  )r%   r   r#   rp  re  rf   r&   s          r'   testIntegration3AddSlursTest.testIntegration3AddSlursw  s
    }}VT;?5<-> ? **,
,,.'"iiS1t*5*  '488!4d:6FGd:.q17<<@  #Z(8(;(N(N(PQ  #Z(8(;(N(N(PQr*   c                    [         R                  " SSSSS.S9n[        R                  " S5      n[        R                  " S5      nSn[        R
                  " XU5      nU R                  XE5        g)zJ
addSlurs(): nothing was added; all three slur-related attributes missing
r   NrX  r   r  r]  FrI   rJ   r   rH   r   ra  r-   r%   r   r#   re  rf   r&   s         r'   testUnit4AddSlursTest.testUnit4AddSlurs  sb     }}VT;?59-; < ^^M2
nnX&t*5*r*   c                    [         R                  " SSSSS.S9n[        R                  " S5      n[        R                  " S5      nSn[        R
                  " XU5      nU R                  XE5        g)	zO
addSlurs(): nothing was added; @slur is present, but only "medial" indicators
r   Nz1m 2mrX  r   r  r]  Fr  r  s         r'   testUnit5AddSlursTest.testUnit5AddSlurs  sb     }}VT;?5<-> ? ^^M2
nnX&t*5*r*   c                   [         R                  " SSSSS.S9n[        R                  " S5      n[        R                  " [        S9Ul        [        R                  " S5      nS	n[        R                  " XU5      nU R                  XE5        g)

addSlurs(): nothing was added; when the Slur with id of @m21SlurStart can't be found

NB: this tests that the inner function works---catching the IndexError
r   $07f5513a-436a-4247-8a5d-85c10c661920NrX  r   r  )r+  r]  F)	rI   rJ   r   rH   
IndexErrorr`  r   ra  r-   r  s         r'   testUnit6AddSlursTest.testUnit6AddSlurs  st     }}V5[37-1%34 ^^M2
"&..Z"H
nnX&t*5*r*   c                   [         R                  " SSSSS.S9n[        R                  " 5       n[        R
                  " SSS9nS	n[        R                  " XU5      nU R                  XE5        U R                  / [        U5      5        g)
r  r   r  NrX  r   ri  rj  rk  F)rI   rJ   r   r$   r   rn  r   ra  r-   r   r   r  s         r'   testIntegration6AddSlursTest.testIntegration6AddSlurs  sz     }}V5[37-1%34 **,
iiS1t*5*  T*%56r*   c                4   [        S5       Vs/ s H  n[        R                  " 5       PM     nn[        [        U5      5       H  n[        R                  " SU S35      X#   l        SX#   R                  R
                  l        [        R                  " 5       X#   R                  l        [        R                  " 5       X#   R                  l        SX#   R                  l
        M     / SQn[        R                  " U5        [        [        U5      5       HS  nX#   R                  R
                  R                  5         X#   R                  R                  R                  SXC   5        MU     US   R                  R                  R                  S5        g	s  snf )
zY
beamTogether(): with three mock objects, that their "beams" attributes are set properly
r|  thing  beamsr   r  )r  r	  r	  r{  r  N)r   r   rH   r  r  __len__rL   r  setAllr   r  r   beamTogetherrP   r%   r   
someThingsr   expectedTypess        r'   testBeamTogether1Test.testBeamTogether1  s0    16a91dnn&
9s:'A"&..6!F1C"DJM78JM''4'+~~'7JM$)-)9JM&*0JM""' ( : 	*%s:'AM''??AM$$<<V]EUV ( 	1""::6B :s   Fc                b   [        S5       Vs/ s H  n[        R                  " 5       PM     nn[        [        U5      5       H  n[        R                  " SU S35      X#   l        SX#   R                  R
                  l        [        R                  " 5       X#   R                  l        [        R                  " 5       X#   R                  l        SX#   R                  l
        M     / SQnSUS   R                  R
                  l        SUS   R                  R
                  l        [        R                  " U5        S	 HS  nX#   R                  R
                  R                  5         X#   R                  R                  R                  SXC   5        MU     US
   R                  R                  R                  S5        S Hg  nU R                  SX#   R                  R                  R                  5        U R                  SX#   R                  R                  R                  5        Mi     gs  snf )zZ
beamTogether(): with four mock objects, the middle two of which already have "beams" set
r   r  r  r   r  )r  NNr	  r{  r   )r   r|  r|  r  )r   r{  N)r   r   rH   r  r  r  rL   r  r  r   r  r   r  rP   r-   r  r  s        r'   testBeamTogether2Test.testBeamTogether2  s    16a91dnn&
9s:'A"&..6!F1C"DJM78JM''4'+~~'7JM$)-)9JM&*0JM""' ( : 45
1##034
1##0*%AM''??AM$$<<V]EUV  	1""::6BAQ
 3 3 8 8 C CDQ
 3 3 : : E EF ) :s   H,c                   [        S5       Vs/ s H  n[        R                  " 5       PM     nnSUS'   S H  n[        R                  " SU S35      X#   l        SX#   R                  R                  l        [        R                  " 5       X#   R                  l        [        R                  " 5       X#   R                  l        SX#   R                  l	        M     / S	Qn[        R                  " U5        S HS  nX#   R                  R                  R                  5         X#   R                  R                  R                  SXC   5        MU     US
   R                  R                  R                  S5        gs  snf )zW
beamTogether(): with four mock objects, one of which doesn't have a "beams" attribute
r   rD   r{  )r   r   r|  r  r  r   r  )r  r	  Nr	  r|  r  N)r   r   rH   r  r  rL   r  r  r   r  r   r  rP   r  s        r'   testBeamTogether3Test.testBeamTogether3  s(    16a91dnn&
9
1A"&..6!F1C"DJM78JM''4'+~~'7JM$)-)9JM&*0JM""'  @ 	*%AM''??AM$$<<V]EUV  	1""::6B! :s   E6c           	        [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n/ n[        S5       H0  nUR                  [        R                  " SSU 3S	U 3S
.S95        M2     [         R                  " US9UR                  l        [        R                  " U5        UR                  R                  R                  U5        [        S5       HM  nU R                  SUR
                  SU 3   S   5        U R                  SUR
                  S	U 3   S   5        MO     g)zC
_ppTies(): that three ties are specified correctly in the m21Attr
rB   c                     0 $ r"  r#  r#  r*   r'   r'  $Test.testUnitTies1.<locals>.<lambda>(      Br*   rE   rF   score//r   r|  start end startidendidr   r{   r   r%  N)r   rH   r   r   r   r"   r    r   r   r<  rI   rJ   rz  _ppTiesrP   r-   r%   mockConverterexpectedIterfindr  r   s        r'   testUnitTies1Test.testUnitTies1!  s5    0F0F0HI +J 7%)^^%5" xwvhcJqA!!%--FSTRU,JNqc
?T #U V  /3nn..Y""+]#""++CCDTUqAS-"7"7&"Ee"LMS-"7"7$qc
"CE"JK r*   c                F   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n[        R                  " SSSS	.S
9/n[         R                  " US9UR                  l
        [        R                  " U5        UR                  R                  R                  U5        U R                  S[        UR
                  5      5        UR                  R                  S5        g)zO
_ppTies(): <tie> without @startid and @endid is properly announced as failing
rB   c                     0 $ r"  r#  r#  r*   r'   r'  $Test.testUnitTies2.<locals>.<lambda>B  r  r*   rE   rF   r  r   4.1z4.2tstamptstamp2r   r{   r   zAImporting <tie> without @startid and @endid is not yet supported.N)r   rH   r   r   r   r"   r    r   rI   rJ   rz  r  rP   r-   r  rk  r%   rl  r  r  r  s        r'   testUnitTies2Test.testUnitTies2:  s     0F0F0HI +J 7%)^^%5" xwvhcJ--SX6YZ[.2nn..Y""+]#""++CCDTUC 5 56700O	Qr*   c           	     (   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n/ n[        S5       H0  nUR                  [        R                  " SSU 3S	U 3S
.S95        M2     [         R                  " US9UR                  l        S Ul        / Ul        [        R                  " U5        UR                  R                  R!                  U5        / nU R#                  S[%        UR                  5      5        UR                   Hc  nU R'                  U[         R                  5        U R#                  S[%        UR(                  5      5        UR                  UR(                  5        Me     [        S5       HQ  nU R+                  UR
                  SU 3   S   U;   5        U R+                  UR
                  S	U 3   S   U;   5        MS     g)z`
_ppSlurs(): that three slurs are specified correctly in the m21Attr,
and put in the slurBundle
rB   c                     0 $ r"  r#  r#  r*   r'   r'  %Test.testUnitSlurs1.<locals>.<lambda>Z  r  r*   rE   rF   r  r[  r|  r  r  r  r   r{   c                 .    [         R                  " S5      $ Nza fake Slurr   rH   r#  r*   r'   r'  r  c      t~~m'Dr*   $   rY  rZ  N)r   rH   r   r   r   r"   r    r   r   r<  rI   rJ   rz  r+  r#   _ppSlursrP   r-   r  r!   rm  r  )r%   r  r  r  r  r   expectedIdLocaleachSlurs           r'   testUnitSlurs1Test.testUnitSlurs1Q  s    0F0F0HI +J 7%)^^%5" xwvhdKqA!!%--EKA3<CGs8M#N O  /3nn..Y""+D#% m$""++CCDTUC 8 89:%00H!!(DNN;RX%5%5!67""8#3#34 1
 qAOOM11F1#,?O./ 0OOM11D*=lK./ 0 r*   c                   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n[        R                  " SSSS	.S
9/n[         R                  " US9UR                  l
        S Ul        / Ul        [        R                  " U5        UR                  R                  R                  U5        U R                  S[!        UR                  5      5        U R                  S[!        UR
                  5      5        UR"                  R                  S5        g)zQ
_ppSlurs(): <slur> without @startid and @endid is properly announced as failing
rB   c                     0 $ r"  r#  r#  r*   r'   r'  %Test.testUnitSlurs2.<locals>.<lambda>  r  r*   rE   rF   r  r[  r  z4.3r  r   r{   c                 .    [         R                  " S5      $ r  r  r#  r*   r'   r'  r    r  r*   r   zBImporting <slur> without @startid and @endid is not yet supported.N)r   rH   r   r   r   r"   r    r   rI   rJ   rz  r+  r#   r  rP   r-   r  rk  )r%   rl  r  r  r  r  s         r'   testUnitSlurs2Test.testUnitSlurs2y  s    0F0F0HI +J 7%)^^%5" xwvhdK--%TY7Z[\.2nn..Y""+D#% m$""++CCDTUC 8 89:C 5 56700P	Rr*   c                ,   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n/ n[        S5       H:  nUR                  [        R                  " SSU 3S	U 3S
U SU SU 3S.S95        M<     [         R                  " US9UR                  l        [        R                  " U5        UR                  R                  R                  U5        [        S5       Hr  nU R                  SUR
                  SU 3   S   5        U R                  SUR
                  SU 3   S   5        U R                  SUR
                  S	U 3   S   5        Mt     g)zY
_ppBeams(): that three beamed notes are specified correctly in the m21Attr

with @plist
rB   c                     0 $ r"  r#  r#  r*   r'   r'  %Test.testUnitBeams1.<locals>.<lambda>  r  r*   rE   rF   r  beamSpanr|  start-end-#start- #mid- #end-)r  r  plistr   r{   r  r  r	  mid-r  Nr   rH   r   r   r   r"   r    r   r   r<  rI   rJ   rz  _ppBeamsrP   r-   r  s        r'   testUnitBeams1Test.testUnitBeams1  sn    0F0F0HI +J 7%)^^%5" xwvhhOqA!!j39!15aSz186!F1#/N&(   /3nn..Y""+m$""++CCDTUqAWm&;&;fQCL&I)&TUZ)>)>aSz)J9)UVV]%:%:T!:%Fy%QR r*   c           	        [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n/ n[        S5       H0  nUR                  [        R                  " SSU 3S	U 3S
.S95        M2     [         R                  " US9UR                  l        [        R                  " U5        UR                  R                  R                  U5        [        S5       HM  nU R                  SUR
                  SU 3   S   5        U R                  SUR
                  SU 3   S   5        MO     g)z\
_ppBeams(): that three beamed notes are specified correctly in the m21Attr

without @plist
rB   c                     0 $ r"  r#  r#  r*   r'   r'  %Test.testUnitBeams2.<locals>.<lambda>  r  r*   rE   rF   r  r  r|  r  #end-r  r   r{   r  r  r  r  r  Nr  r  s        r'   testUnitBeams2Test.testUnitBeams2  s4    0F0F0HI +J 7%)^^%5" xwvhhOqA!!%--
ELQC=CH8N#O P  /3nn..Y""+m$""++CCDTUqAWm&;&;fQCL&I)&TUV]%:%:T!:%Fy%QR r*   c                F   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3n[        R                  " SSSS	.S
9/n[         R                  " US9UR                  l
        [        R                  " U5        UR                  R                  R                  U5        U R                  S[        UR
                  5      5        UR                  R                  S5        g)zU
_ppBeams(): <beamSpan> without @startid and @endid is properly announced as failing
rB   c                     0 $ r"  r#  r#  r*   r'   r'  %Test.testUnitBeams3.<locals>.<lambda>  r  r*   rE   rF   r  r  z12.4z13.1r  r   r{   r   zFImporting <beamSpan> without @startid and @endid is not yet supported.N)r   rH   r   r   r   r"   r    r   rI   rJ   rz  r  rP   r-   r  rk  r  s        r'   testUnitBeams3Test.testUnitBeams3  s     0F0F0HI +J 7%)^^%5" xwvhhO--
fY_;`ab.2nn..Y""+m$""++CCDTUC 5 56700T	Vr*   c                    [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3nSnSn/ n[        S	5       H4  nUR                  [        R                  " SS
U SU SU 3UUS.S95        M6     [         R                  " US9UR                  l        [        R                  " U5        UR                  R                  R                  U5        [        S	5       H  nU R                  X1R
                  SU 3   S   5        U R                  UUR
                  SU 3   S   5        U R                  X1R
                  SU 3   S   5        U R                  UUR
                  SU 3   S   5        U R                  X1R
                  SU 3   S   5        U R                  UUR
                  SU 3   S   5        M     g)z`
_ppTuplets(): that three notes in a tuplet are specified correctly in the m21Attr

with @plist
rB   c                     0 $ r"  r#  r#  r*   r'   r'  'Test.testUnitTuplets1.<locals>.<lambda>  r  r*   rE   rF   r  
tupletSpanr  r  r|  r  r  r  )r  numnumbaser   r{   r  r  r  r  r  Nr   rH   r   r   r   r"   r    r   r   r<  rI   rJ   rz  
_ppTupletsrP   r-   r%   r  r  theNum
theNumbaser  r   s          r'   testUnitTuplets1Test.testUnitTuplets1  s    0F0F0HI +J 7%)^^%5" xwvhjQ
qA!!%--#*1#VA3fQC!@%#-/#0 1  /3nn..Y""+&""++CCDTUqAV%:%:VA3<%H%XYZ*22VA3<@ASTVV%:%:T!:%F~%VWZ*22T!:>?QRTV%:%:T!:%F~%VWZ*22T!:>?QRT r*   c                P   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3nSnSn[        R                  " SXES	.S
9/n[         R                  " US9UR                  l
        Sn[        R                  " U5        UR                  R                  R                  U5        U R                  S[        UR
                  5      5        UR                  R                  U5        g)ze
_ppTuplets(): <tupletSpan> without (@startid and @endid) or
@plist is properly announced as failing
rB   c                     0 $ r"  r#  r#  r*   r'   r'  'Test.testUnitTuplets2.<locals>.<lambda>  r  r*   rE   rF   r  r  r  r  r  r  r   r{   zRImporting <tupletSpan> without @startid and @endid or @plist is not yet supported.r   N)r   rH   r   r   r   r"   r    r   rI   rJ   rz  r  rP   r-   r  rk  )r%   rl  r  r  r  r  r  
expWarnings           r'   testUnitTuplets2Test.testUnitTuplets2  s     0F0F0HI +J 7%)^^%5" xwvhjQ
--7=/UW X.2nn..Y""+A
 	&""++CCDTUC 5 56700<r*   c                   [         R                  " [        R                  " 5       S9n[	        S 5      Ul        [         R                  " 5       Ul        S[         S[         S[         S3nSnSn/ n[        S	5       H2  nUR                  [        R                  " SS
U 3SU 3UUS.S95        M4     [         R                  " US9UR                  l        [        R                  " U5        UR                  R                  R                  U5        S H  nU R                  X1R
                  SU 3   S   5        U R                  UUR
                  SU 3   S   5        U R                  SUR
                  SU 3   S   5        U R                  X1R
                  SU 3   S   5        U R                  UUR
                  SU 3   S   5        U R                  SUR
                  SU 3   S   5        M     g)z
_ppTuplets(): that three notes in a tuplet are specified correctly in the m21Attr

without @plist (this should set @m21TupletSearch attributes)
rB   c                     0 $ r"  r#  r#  r*   r'   r'  'Test.testUnitTuplets3.<locals>.<lambda>6  r  r*   rE   rF   r  r  r  r  r|  r  r  )r  r  r  r  r   r{   r   r{  r  r  r  r  r  r  r  Nr  r  s          r'   testUnitTuplets3Test.testUnitTuplets3-  s    0F0F0HI +J 7%)^^%5" xwvhjQ
qA!!%--ELQC=CH?ECM8O#P Q  /3nn..Y""+&""++CCDTUAV%:%:VA3<%H%XYZ*22VA3<@ASTVW*22VA3<@ARSUV%:%:T!:%F~%VWZ*22T!:>?QRTUM$9$9D*$EFW$XY r*   c                B   Sn[         R                  " [        R                  " 5       S9n[        R
                  " U5      Ul        [        S 5      Ul        SUR                  S   S'   SUR                  S   S'   [        SSSSS0n[        S	0n[        R                  " U5        UR                  R                  S
[         S35      nUR                  R                  S
[         S35      nU R                  X5R                  5        U R                  XFR                  5        g)z
_ppConclude(): that it works
zB<mei><music><note xml:id="one"/><note xml:id="two"/></music></mei>rB   c                     0 $ r"  r#  r#  r*   r'   r'  (Test.testUnitConclude1.<locals>.<lambda>Z  r  r*   14r~  newr7  otherry  z*//*[@z="one"]z="two"]N)r   rH   r   r   rI   r2  r    r   r"   r   _ppConcluderK   r-   r   )r%   theDocumentr  expNoteOneAttribexpNoteTwoAttribnoteOnenoteTwos          r'   testUnitConclude1Test.testUnitConclude1S  s     _0F0F0HI%*%5%5k%B" +J 7.2e$U+04e$W-"E5$F"E?',,11F6('2JK,,11F6('2JK)>>:)>>:r*   c                   [        S5       Vs/ s H  n[        R                  " 5       PM     nn[        R                  " SSSSS.S9n[
        R                  " X#5        U HW  nU R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  5        MY     gs  snf )	zW
scaleToTuplet(): with three objects, the "tuplet search" attributes are set properly.
r|  	tupletDefr   400z
the forest)r  r  r  r   N)r   r   rn  rI   rJ   r   scaleToTupletr-   r  r  r  )r%   r   objsr   re  s        r'   testTuplets1Test.testTuplets1l  s     &+1X.X		X.}}[599>8D%FG
 	4&CT3#3#34UC$8$89\3+>+>?  /s   B<zmusic21.duration.Tupletc                   [        S5       Vs/ s H  n[        R                  " 5       PM     nnU HS  n[        R                  " 5       Ul        SUR
                  l        [        R                  " 5       /UR
                  l        MU     [        R                  " SSSSS.S9nS	Ul
        [        R                  " S
SSSS9n[        R                  " X55        U R                  SUR                  5        UR                    H  nU R                  Xg5        M     U H6  nU R                  SUR
                  R                  S   R                  5        M8     gs  snf )z`
scaleToTuplet(): with three objects, their
duration is scaled properly. (With @m21TupletType).
r|  duration typer  r   r  banana)r  r  r  r   a Tupletr     numberNotesActualdurationActualnumberNotesNormaldurationNormalr   N)r   r   rn  r   rH   r   r  r  rI   rJ   rL   rr  r   r  r-   r  rs  r%   rT   r   r  re  r   expectedCalleachCalls           r'   testTuplets2Test.testTuplets2}  s    &+1X.X		X.C>>+CL /CLL$(NN$4#5CLL   }}[599>6>%@A #-
yy2o36X 	4&J112"11H\4 2CXs||';';A'>'C'CD % /s   Ec                   [        S5       Vs/ s H*  n[        R                  " [        R                  " 5       S9PM,     nnU HS  n[        R                  " 5       Ul        SUR
                  l        [        R                  " 5       /UR
                  l        MU     [        R                  " SSSSS.S	9nS
Ul
        [        R                  " SSSSS9n[        R                  " X55        U R                  SUR                  5        UR                    H  nU R                  Xg5        M     U H6  nU R                  SUR
                  R                  S   R                  5        M8     gs  snf )za
scaleToTuplet(): with three objects, their duration is
scaled properly. (With @tuplet == 'i1').
r|  specr  r  r   r  r~  r  r  tupletr   r  r   r  r  r  r   N)r   r   rH   r   rn  r   r  r  rI   rJ   rL   rr  r   r  r-   r  rs  r   s           r'   testTuplets3Test.testTuplets3  s     ;@(C(QDIIK0(CC>>+CL /CLL$(NN$4#5CLL   }}[$\a<@2B C",
yy2o36X 	4&J112"11H\4 2CWcll&:&:1&=&B&BC ! Ds   1E$c                f   [         R                  " [        R                  " 5       S9n[         R                  " 5       Ul        SUR                  l        [         R                  " 5       /UR                  l        [        R                  " SSSSS.S9nS	Ul	        [         R                  " S
SSSS9n[        R                  " X#5        U R                  SUR                  5        U R                  XAR                  S   5        U R                  SUR                  R                  S   R
                  5        g)z\
scaleToTuplet(): with one object, its duration is scaled properly. (With @tuplet == 't1').
r&  r  r  r   r  t1r(  r   r  r   r  r  r   r   r  N)r   rH   r   rn  r   r  r  rI   rJ   rL   rr  r   r  r-   r  rs  )r%   rT   re  r   r!  s        r'   testTuplets4Test.testTuplets4  s    
 nn$))+.~~'+ $ 01}}[$\a<@2B C",
yy2o36X 	3%J112'@'@'CD!5!5a!8!=!=>r*   c                   [        S5       Vs/ s H*  n[        R                  " [        R                  " 5       S9PM,     nnU HS  n[        R                  " 5       Ul        SUR
                  l        [        R                  " 5       /UR
                  l        MU     [        R                  " [        R                  " 5       S9US'   [        R                  " SSSSS	.S
9nSUl        [        R                  " SSSSS9n[        R                  " X55        U R!                  SUR"                  5        UR$                   H  nU R!                  Xg5        M     U R!                  SUS   R
                  R                  S   R                  5        U R!                  / US   R
                  R$                  5        U R!                  SUS   R
                  R                  S   R                  5        gs  snf )zw
scaleToTuplet(): with three objects, their duration is scaled properly. (One of the objects
isn't a Note/Chord/Rest).
r|  r&  r  r   r  r   r  r~  r(  r   r  r   r  r  r{  r  r   N)r   r   rH   r   rn  r   r  r  r
   r  rI   rJ   rL   rr  r   r  r-   r  rs  r   s           r'   testTuplets5Test.testTuplets5  s    ;@(C(QDIIK0(CC>>+CL /CLL$(NN$4#5CLL   ..doo&78Q}}[$\a<@2B C",
yy2o36X 	4&J112"11H\4 2$q'"2"2":":1"="B"BCT!W--<<=$q'"2"2":":1"="B"BC' Ds   1G'c                   [         R                  " SSS0S9nU R                  [        R                  [        R
                  U5         [        R
                  " U5        [         R                  " SSS0S9nU R                  [        R                  [        R
                  U5         [        R
                  " U5        g! [        R                   a7  nU R                  [        R                  UR                  S   5         SnANSnAff = f! [        R                   a7  nU R                  [        R                  UR                  S   5         SnAgSnAff = f)	zi
tupletFromElement(): when either @num or @numbase isn't in the element, raise an
    MeiAttributeError.
r)  r  r   r   r   Nr  rS  )	rI   rJ   r3   r   r  tupletFromElementr-   _MISSING_TUPLET_DATAr6   )r%   r   errs      r'   testTuplets6Test.testTuplets6  s    }}Xucl;$00$2H2H$O	E""4( }}Xy#.>?$00$2H2H$O	E""4( %% 	ET66DD	E %% 	ET66DD	Es0   B< %D
 <D-DD
E-EEzmusic21.mei.base.beamTogetherc                J   [         R                  " SSSS.S9n[        S5       Vs/ s H*  n[        R                  " [
        R                  " 5       S9PM,     nnU HX  n[        R                  " [        R                  " 5       S9/UR                  l	        SUR                  R                  S	   l
        MZ     Xbl        S
 Ul        [        R                  " U5      nU R                  Xh5        UR!                  U5        U R#                  SUS	   R                  R                  S	   R                  5        U R#                  SUS   R                  R                  S	   R                  5        U R#                  SUS   R                  R                  S	   R                  5        gs  snf )zS
tupletFromElement(): everything set properly in a triplet; no extraneous elements
r)  r   rS  r  r   r|  r&  defaultr   c                    U $ r"  r#  rq  s    r'   r'  #Test.testTuplets7.<locals>.<lambda>      r*   r  r   r  r{  N)rI   rJ   r   r   rH   r   rn  r   Tupletr  r  rL   r+  r   r4  r   rP   r-   )	r%   mockBeamrT   mockEmbeddedr   r   	mockNotesre  r&   s	            r'   testTuplets7Test.testTuplets7  sC    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  #,*''-  3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG Is   1F c                   [         R                  " SSSS.S9n[        S5       Vs/ s H*  n[        R                  " [
        R                  " 5       S9PM,     nnU HX  n[        R                  " [        R                  " 5       S9/UR                  l	        SUR                  R                  S	   l
        MZ     S
 H,  n[        R                  " [        R                  " 5       S9Xh'   M.     Xbl        S Ul        [        R                   " U5      n	U R#                  Xi5        UR%                  U5        U R'                  SUS	   R                  R                  S	   R                  5        U R'                  SUS   R                  R                  S	   R                  5        U R'                  SUS   R                  R                  S	   R                  5        gs  snf )z[
tupletFromElement(): everything set properly in a triplet; extraneous elements interposed
r)  r   rS  r  r   r   r&  r:  r   )r   r{  r   c                    U $ r"  r#  rq  s    r'   r'  #Test.testTuplets8.<locals>.<lambda>  r=  r*   r  r|  r  rD   NrI   rJ   r   r   rH   r   rn  r   r>  r  r  r
   r  rL   r+  r   r4  r   rP   r-   
r%   r?  rT   r@  r   r   rA  re  r   r&   s
             r'   testTuplets8Test.testTuplets8  sd    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  A>>t/@AIL "+*''-  3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG I   1Gc                   [         R                  " SSSS.S9n[        S5       Vs/ s H*  n[        R                  " [
        R                  " 5       S9PM,     nnU HX  n[        R                  " [        R                  " 5       S9/UR                  l	        SUR                  R                  S	   l
        MZ     S
 H,  n[        R                  " [        R                  " 5       S9Xh'   M.     Xbl        S Ul        [        R                   " U5      n	U R#                  Xi5        UR%                  U5        U R'                  SUS   R                  R                  S	   R                  5        U R'                  SUS   R                  R                  S	   R                  5        U R'                  SUS   R                  R                  S	   R                  5        gs  snf )zx
tupletFromElement(): everything set properly in a triplet; extraneous elements interposed,
    prepended, and appended
r)  r   rS  r  r      r&  r:  r   )r   r{  r|  rD      c                    U $ r"  r#  rq  s    r'   r'  #Test.testTuplets9.<locals>.<lambda>7  r=  r*   r  r   r   r  r   NrG  rH  s
             r'   testTuplets9Test.testTuplets9&  sd    }}Xcc.JK?DQxHx!T^^5x	HC$(NN8I$J#KCLL +4CLL  #(  !A>>t/@AIL !"+*''-  3((3)A,"7"7"?"?"B"G"GHIaL$9$9$A$A!$D$I$IJ1!6!6!>!>q!A!F!FG IrK  c                J   [        S5       Vs/ s H  n[        R                  " SS9PM     nn[        S5       Vs/ s H  nSPM     nn[        R                  " U5      n[        [        U5      5       H#  nU R                  X5   XE   R                  5        M%     gs  snf s  snf )z\
_guessTuplets(): given a list of stuff without tuplet-guessing attributes, make no changes
rD   rZ  rk  N)r   r   rn  r   _guessTupletsr  r-   ri  r%   r   theLayerexpectedDursr&   r   s         r'   testTuplet10Test.testTuplet10A  s     ;@(C(QDIIC0(C%*1X.XX.##H-s<()A\_fi.E.EF * D.s
   BB c                   [        S5       Vs/ s H  n[        R                  " SS9PM     nnSUS   l        SUS   l        SUS   l        SUS	   l        SUS	   l        SUS	   l        [        S	S
5      [        S	S
5      [        S	S
5      SS/n[        R                  " U5      n[        [        U5      5       H#  nU R                  X5   XE   R                  5        M%     S HZ  nU R                  [        X%   S5      5        U R                  [        X%   S5      5        U R                  [        X%   S5      5        M\     gs  snf )zM
_guessTuplets(): with 5 notes, a triplet at the beginning is done correctly
rD   rZ  rk  r  r   r   rS  r  r{  r|  r  r  r  r  Nr   r   rn  r  r  r  r   r   rT  r  r-   ri  r4  r5  rU  s         r'   testTuplet11aTest.testTuplet11aM  s%    ;@(C(QDIIC0(C&-##& '*$&+##& '*$ AAASQ##H-s<()A\_fi.E.EF *AWX[2CDEWX[.ABWX[2DEF  D   Ec                   [        S5       Vs/ s H  n[        R                  " SS9PM     nnSUS   l        SUS   l        SUS   l        SUS	   l        SUS	   l        SUS	   l        S[        S
S	5      [        S
S	5      [        S
S	5      S/n[        R                  " U5      n[        [        U5      5       H#  nU R                  X5   XE   R                  5        M%     S HZ  nU R                  [        X%   S5      5        U R                  [        X%   S5      5        U R                  [        X%   S5      5        M\     gs  snf )zJ
_guessTuplets(): with 5 notes, a triplet in the middle is done correctly
rD   rZ  rk  r  r   r   rS  r  r|  r{  )r   r|  r  r  r  Nr[  rU  s         r'   testTuplet11bTest.testTuplet11bc  s%    ;@(C(QDIIC0(C&-##& '*$&+##& '*$Xa^Xa^Xa^SQ##H-s<()A\_fi.E.EF *AWX[2CDEWX[.ABWX[2DEF  Dr^  c                   [        S5       Vs/ s H  n[        R                  " SS9PM     nnSUS   l        SUS   l        SUS   l        SUS	   l        SUS	   l        SUS	   l        SS[        SS
5      [        SS
5      [        SS
5      /n[        R                  " U5      n[        [        U5      5       H#  nU R                  X5   XE   R                  5        M%     S HZ  nU R                  [        X%   S5      5        U R                  [        X%   S5      5        U R                  [        X%   S5      5        M\     gs  snf )zG
_guessTuplets(): with 5 notes, a triplet at the end is done correctly
rD   rZ  rk  r  r{  r   rS  r  r   r|  )r{  r   r  r  r  Nr[  rU  s         r'   testTuplet11cTest.testTuplet11cy  s%    ;@(C(QDIIC0(C&-##& '*$&+##& '*$S(1a.(1a.(1a.Q##H-s<()A\_fi.E.EF *AWX[2CDEWX[.ABWX[2DEF  Dr^  z,music21.instrument.instrumentFromMidiProgramc                    [         R                  " SSS0S9nSnSUl        UR                  n[        R                  " U5      nU R                  XE5        UR                  U5        g)z5
instrDefFromElement(): when @midi.instrnum is given
r  r  r  r   G   zGuess Which InstrumentNrI   rJ   rL   r   instrDefFromElementr-   rP   )r%   mockFromProgr   expFromProgArgrf   r&   s         r'   testUnit1InstrDefTest.testUnit1InstrDef  s]    
 }}Z$0GH$<!,,))$/*,,^<r*   c                    [         R                  " SSS0S9nSnSUl        UR                  n[        R                  " U5      nU R                  XE5        UR                  U5        g)zD
instrDefFromElement(): when @midi.instrname is given, and it works
r  r  Tubar   zThat's right: tubaNrg  )r%   r  r   expFromStringArgrf   r&   s         r'   testUnit2InstrDefTest.testUnit2InstrDef  s`    
 }}Z1A60JK!&:#!..))$/*../?@r*   zmusic21.mei.base.instrumentc                "   [         R                  Ul        [        R                  " SSS0S9nSn[        R
                  " 5       Ul        [        UR                  l        [        R
                  " 5       UR                  l
        SUR                  R                  l        UR                  R                  n[        R                  " U5      nU R                  XE5        UR                  R                  U5        U R                  X5R                  5        g)zX
instrDefFromElement(): when @midi.instrname is given, and it explodes (AttributeError)
r  r  Gold-Plated Kazoor   N)r   r  rI   rJ   r   rH   
fromStringAttributeErrorr+  r  rL   r  r   rh  r-   rP   r%   r  r   ro  rf   r&   s         r'   testUnit3aInstrDefTest.testUnit3aInstrDef  s     )3(F(F	%}}Z1ACV0WX.#~~/	+9	(,0NN,<	)59	))2''44))$/*445EF)??;r*   c                6   [         R                  Ul        [        R                  " SSS0S9nSn[        R
                  " 5       Ul        [         R                  UR                  l        [        R
                  " 5       UR                  l	        SUR                  R                  l
        UR                  R                  n[        R                  " U5      nU R                  XE5        UR                  R                  U5        U R                  X5R                  5        g)z]
instrDefFromElement(): when @midi.instrname is given,
and it explodes (InstrumentException)
r  r  rs  r   N)r   r  rI   rJ   r   rH   rt  r+  r  rL   r  r   rh  r-   rP   rv  s         r'   testUnit3bInstrDefTest.testUnit3bInstrDef  s     )3(F(F	%}}Z1ACV0WX.#~~/	+5+I+I	(,0NN,<	)59	))2''44))$/*445EF)??;r*   c                   [         R                  " S5      n[        R                  " 5       [        R                  " 5       [        R                  " 5       SS.n[        R
                  " X5      nS H=  nU R                  X#   R                  5        U R                  X#   R                  5        M?     U R                  SUS   5        g)zB
_makeBarlines(): when @left and @right are None, nothing happens
measurer   r"  rz   rS  r   r   N)
rI   rJ   r   Measurer   _makeBarlinesr>  leftBarlinerightBarliner-   r%   r   stavesr   s       r'   testMakeBarline1Test.testMakeBarline1  s     }}Y'~~'fnn.>V^^EU\]^##D1 Afi334fi445 ! 	F3K(r*   c                l   [         R                  " SSSS.S9n[        R                  " 5       [        R                  " 5       [        R                  " 5       SS.n[        R
                  " X5      nS H  nU R                  X#   R                  [        R                  5        U R                  SX#   R                  R                  5        U R                  X#   R                  [        R                  5        U R                  SX#   R                  R                  5        M     U R                  SUS	   5        g
)zW
_makeBarlines(): when @left and @right are a simple barline, that barline is assigned
r}  dblleftr  r   r   r"  r~  doubler   N)rI   rJ   r   r  r   r  r!   r  r	   r  r-   r  r  r  s       r'   testMakeBarline2Test.testMakeBarline2  s     }}Y/NO~~'fnn.>V^^EU\]^##D1 A!!&)"7"7EXvy'<'<'A'AB!!&)"8"8#++FXvy'='='B'BC	 !
 	F3K(r*   c                l   [         R                  " SSSS.S9n[        R                  " 5       [        R                  " 5       [        R                  " 5       SS.n[        R
                  " X5      nS H  nU R                  X#   R                  [        R                  5        U R                  SX#   R                  R                  5        U R                  X#   R                  [        R                  5        U R                  S	X#   R                  R                  5        M     U R                  SUS
   5        g)zL
_makeBarlines(): when @left and @right are "rptboth," that's done properly
r}  r  r  r   r   r"  r~  zheavy-lightr  r   N)rI   rJ   r   r  r   r  r!   r  r	   r  r-   r  r  r  s       r'   testMakeBarline3Test.testMakeBarline3   s     }}Y	I/VW~~'fnn.>V^^EU\]^##D1 A!!&)"7"7D]FI,A,A,F,FG!!&)"8"8#**EWfi&<&<&A&AB	 !
 	F3K(r*   c                   [         R                  " [         R                  " [        R                  " 5       [        R                  " 5       /5      /5      [         R                  " [         R                  " [        R                  " 5       [        R                  " 5       /5      /5      S.n[
        R                  " US5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        g)	z
_correctMRestDurs(): nothing happens when there isn't at object with "m21wasMRest"

This is an integration test of sorts, using no Mock objects.
rz   rS  rj  rZ  rz   r   r   rS  N)
r   r  r  r   r  r   _correctMRestDursr-   voicesri  r%   r  s     r'   testCorrectMRestDurs1Test.testCorrectMRestDurs1  s    ~~v||TYY[$))+4N'O&PQ~~v||TYY[$))+4N'O&PQSvs+fSk003A6DDEfSk003A6DDEfSk003A6DDEfSk003A6DDEr*   c                   [         R                  " [         R                  " [        R                  " 5       /5      /5      [         R                  " [         R                  " [        R                  " 5       [        R                  " 5       /5      /5      S.nSUS   S   S   l        [        R                  " US5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        U R                  [        US   R                  S   S   S	5      5        g
)z
_correctMRestDurs(): things with "m21wasMRest" are adjusted properly

This is an integration test of sorts, using no Mock objects.
r  Trz   r   rj  rZ  rS  r   r  N)r   r  r  r   r  r  r   r  r-   r  ri  r4  r5  r  s     r'   testCorrectMRestDurs2Test.testCorrectMRestDurs2  s!    ~~v||TYY[M'B&CD~~v||TYY[$))+4N'O&PQS(,sAq%vs+fSk003A6DDEfSk003A6DDEfSk003A6DDE!3!3A!6q!9=IJr*   c                   [         R                  " [         R                  " [        R                  " 5       /5      [         R                  " [        R                  " 5       /5      /5      [         R                  " [
        R                  " S5      [         R                  " [        R                  " 5       /5      /5      S.nSUS   S   S   l        SUS   S   S   l        [        R                  " US5        U R                  SUS   R                  S   S   R                  5        U R                  SUS   R                  S   S   R                  5        U R                  SUS	   R                  S   S   R                  5        U R                  [        US   S   S   S
5      5        U R                  [        US   S   S   S
5      5        g)z
_correctMRestDurs(): works with more than 1 voice per part,
and for things that aren't Voice

This is an integration test of sorts, using no Mock objects.
z4/4r  Trz   r   r   rj  rZ  rS  r  N)r   r  r  r   r  r   r  rn  r  r   r  r-   r  ri  r4  r5  r  s     r'   testCorrectMRestDurs3Test.testCorrectMRestDurs3-  sr    ~~v||TYY[M'BFLLRVR[R[R]Q^D_&`a~~u':':5'A6<<QUQZQZQ\P]C^&_`b(,sAq%(,sAq%vs+fSk003A6DDEfSk003A6DDEfSk003A6DDEQ!2MBCQ!2MBCr*   z!music21.mei.base.staffFromElementz"music21.mei.base._correctMRestDurszmusic21.mei.base._makeBarlineszmusic21.stream.Measurec                (  ^^ [          S3n[        R                  " SSS0S9n[        S5       Vs/ s H&  n[        R                  " US[	        US-   5      0S9PM(     n	nU	 H  n
UR                  U
5        M     Sn/ S	Qn[        R                  " S
S9n[        R                  " SS9n[        R                  " S5      Ul
        [        S5       Vs/ s H  n[        R                  " SUS-    3S9PM     snmTnT H;  n[        R                  " [        R                  S9Ul        SUR                  l        M=     U4S jUl        S Ul        SUl        [        [        [        U	5      5      5      mU4S jUl        [        R                  " SS9Ul        [!        U5       VVs0 s H  u  pUUU   _M     nnn["        R$                  " X{XU5      nU R'                  UU5        U R)                  [        U	5      UR*                  5        U	 H  n
UR-                  XS9  M     U R)                  [        U5      UR*                  5        [        [        U	5      5       H+  nUR-                  U[/        UR1                  S5      5      S9  M-     UR-                  UR                  /[/        UR1                  S5      5      S9  U R)                  SUR                  R2                  5        UR5                  US5        UR5                  UU5        gs  snf s  snf s  snnf )a  
measureFromElement(): test 1
    - "elem" has an @n attribute
    - some staves have <mRest> without @dur (same behaviour to as if no staves did)
    - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
      corresponding <staff> element, and its Measure has the same @n as "elem"
    - activeMeter isn't None, and it is larger than the (internal) maxBarDuration

mocked: staffFromElement(), stream.Measure() and Voice, _correctMRestDurs(), _makeBarlines()
staffr}  r6  r7  r   r|  r   r  r"  r#   r  activeMeter      @r   Measure rB   c                 &   > TR                  S5      $ r  r  r  r&  mockMeasRetss     r'   r'  'Test.testMeasureUnit1.<locals>.<lambda>b      ,2B2B12Er*   c                    U$ r"  r#  r   r  s     r'   r'  r  d      Fr*   Nc                 &   > TR                  S5      $ r  r  r  r&  staffFEreturnss     r'   r'  r  i      .2D2DQ2Gr*   r  r  r>  rz   )r   rI   rJ   r   r   r<  r   rH   r   r  barDurationri  r+  rL   r   r  	enumerater   measureFromElementr  r-   r  r  intr|   r  rP   r%   r  mockMeasuremockMakeBarlinesmockCorrectDursmockStaffFEstaffTagr   r6  innerStaffs	eachStaff	backupNum
expectedNsr#   r  r   rf   measr&   r  r  s                      @@r'   testMeasureUnit1Test.testMeasureUnit1?  s   " XU#}}YT{;RWXYRZ[RZQu}}XsCAJ6GHRZ[$IKK	" % 	)
^^6
nn-8"*"3"3C"8 JOqRAhq1ug,>?R D NNH4E4EFDM*-DMM' ! #F'B$'+$eC$456"G!%W!=	/8/DE/DtqAx{N/DE((*R]^Xv.[);+A+AB$I''	'I % 	X(>(>?s;'(A''#dhhsm2D'E )##Y%;%;$<SRUEW#Xi44778//#>00x@] \ S  Fs   -L$L	"Lc                   [          S3n[          S3n[          S3n[        R                  " SSSS.S9n[        S	5       Vs/ s H&  n[        R                  " US
[	        US-   5      0S9PM(     nn[        U5       Hr  u  px[        R                  " US
S0S9n	U	R                  [        R                  " US[	        US-   5      SS.S95        UR                  U	5        UR                  U5        Mt     Sn
/ SQn[        R                  " 5       n[        R                  " S5      n[        R                  " XJXU5      nU R                  S[        UR                  5       5      5        U H  nU R!                  X;   5        M     S GH7  nU R                  SX   R"                  5        U R                  S[        X   5      5        U R%                  X   S   [&        R(                  5        U R                  S[        X   S   5      5        U R%                  X   S   S   [*        R,                  5        U R                  [/        U5      X   S   S   R0                  R2                  5        U R%                  X   R4                  [6        R8                  5        U R                  SX   R4                  R:                  5        GM:     U R                  SUS   R"                  5        U R                  S[        US   5      5        U R%                  US   S   [&        R(                  5        U R                  S[        US   S   5      5        U R%                  US   S   S   [*        R<                  5        U R                  UR>                  R@                  US   S   S   RB                  R@                  5        U R%                  UW   R4                  [6        R8                  5        U R                  SX   R4                  R:                  5        gs  snf )a  
measureFromElement(): test 1
    - "elem" has an @n attribute
    - some staves have <mRest> without @dur (same behaviour to as if no staves did)
    - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
      corresponding <staff> element, and its Measure has the same @n as "elem"
    - activeMeter isn't None, and it is larger than the (internal) maxBarDuration
    - the right barline is set properly ("dbl")

no mocks
r  r  r   r}  r7  r  )r6  r  r   r|  r6  r   rz   rK  rq  r  r"  8/8r   r~  r  r{  r   r  r   N)"r   rI   rJ   r   r   r  r<  r   r$   r   r  r   r  r-   r  keysr  r>  r!   r   r  r   rn  r  r   rd   r  r	   r  r  r  r  ri  r   )r%   r  layerTagnoteTagr   r6  r  r   r  	thisLayerr  r  r#   r  r&   eachNs                   r'   testMeasureIntegration1Test.testMeasureIntegration1  sW    XU#XU#HD/}}YTE/JKRWXYRZ[RZQu}}XsCAJ6GHRZ[%k2LAhSzBIU]]7<?APQE
[^2_a bY'KK	" 3 	)
**,
))%0((*R]^ 	C./EOOEO,  
 %ER!5!56QFM 23!!&-"2FLLAQFM!$4 56!!&-"21"5tyyASZq)9!)<)B)B)I)IJ!!&-"<"<ckkJXv}'A'A'F'FG % 	VC[//0Cs,-fSk!nfll;CsA/0fSk!nQ/;00>>Q*33AA	CfUm88#++F6=#=#=#B#BCQ \s   -Pc                  ^^ [          S3n[        R                  " S5      n[        S5       Vs/ s H&  n[        R                  " US[	        US-   5      0S9PM(     n	nU	 H  n
UR                  U
5        M     Sn/ SQn[        R                  " S	S
9n[        R                  " SS
9n[        R                  " S5      Ul
        [        S5       Vs/ s H  n[        R                  " SUS-    3S
9PM     snmTnT HL  n[        R                  " [        R                  S9Ul        [        R                  S   UR                  l        MN     U4S jUl        S Ul        SUl        [!        [        [#        U	5      5      5      mU4S jUl        [        R                  " SS
9Ul        [%        U5       VVs0 s H  u  pUUU   _M     nnn[        R&                  " X{XU5      nU R)                  UU5        U R+                  [#        U	5      UR,                  5        U	 H  n
UR/                  XS9  M     U R+                  [#        U5      UR,                  5        [        [#        U	5      5       H  nUR/                  XS9  M     UR/                  UR                  /US9  U R+                  SUR                  R0                  5        UR3                  US5        UR3                  UU5        gs  snf s  snf s  snnf )aq  
measureFromElement(): test 2
    - "elem" doesn't have an @n attribute
    - all staves have <mRest> without @dur
    - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
      corresponding <staff> element, and it properly uses "backupNum"

mocked: staffFromElement(), stream.Measure() and Voice, _correctMRestDurs(), _makeBarlines()
r  r}  r|  r6  r   r   r  r"  r#   r  r  g      (@r   r  rB   Nc                 &   > TR                  S5      $ r  r  r  s     r'   r'  'Test.testMeasureUnit2.<locals>.<lambda>  r  r*   c                    U$ r"  r#  r  s     r'   r'  r    r  r*   c                 &   > TR                  S5      $ r  r  r  s     r'   r'  r    r  r*   r  r  r  rz   )r   rI   rJ   r   r   r<  r   rH   r   r  r  r   r  ri  r+  rL   r   r  r  r  r  r-   r  r  r  rP   r  s                      @@r'   testMeasureUnit2Test.testMeasureUnit2  s     XU#}}Y'RWXYRZ[RZQu}}XsCAJ6GHRZ[$IKK	" % 	)
^^6
nn-8"*"3"3D"9 JOqRAhq1ug,>?R D NNH4E4EFDM*.*=*=d*CDMM' ! #F'B$'+$eC$456"G!%W!=	/8/DE/DtqAx{N/DE((*R]^Xv.[);+A+AB$I''	'I % 	X(>(>?s;'(A'''< )##Y%;%;$<Y#Oi44778//$?00x@_ \ S  Fs   -K#$K(2K-c                   [          S3n[          S3n[          S3n[        R                  " SSS0S9n[        S5       Vs/ s H&  n[        R                  " US	[	        US
-   5      0S9PM(     nnU Ha  n[        R                  " US	S0S9nUR                  [        R                  " U5      5        UR                  U5        UR                  U5        Mc     Sn	/ SQn
[        R                  " 5       n[        R                  " S5      n[        R                  " XIXU5      nU R                  S[        UR                  5       5      5        U
 H  nU R                  X;   5        M     U R                  SU;   5        U
 GHC  nU R                  XU   R                   5        U R                  S[        X   5      5        U R#                  X   S   [$        R&                  5        U R                  S
[        X   S   5      5        U R#                  X   S   S   [(        R*                  5        U R                  UR,                  R.                  US   S   S   R0                  R.                  5        U R#                  X   R2                  [4        R6                  5        U R                  SX   R2                  R8                  5        GMF     gs  snf )a|  
measureFromElement(): test 2
    - "elem" doesn't have an @n attribute
    - all staves have <mRest> without @dur (and only 3 of the 4 are specified at all)
    - a rest-filled measure is created for the "n" value in "expectedNs" that's missing a
      corresponding <staff> element, and it properly uses "backupNum"
    - the right barline is set properly ("rptboth")

no mocks
r  r  r  r}  r  r  r   r|  r6  r   rz   r  r"  r  rD   
next @leftr{  r   r   r  N)r   rI   rJ   r   r   r<  r   r$   r   r  r   r  r-   r  r  r  r>  r!   r   r  r   r  r  ri  r   r  r	   r  r  )r%   r  r  mRestTagr   r6  r  r  r  r  r  r#   r  r&   r  s                  r'   testMeasureIntegration2Test.testMeasureIntegration2  sP    XU#XU#XU#}}Y/CDRWXYRZ[RZQu}}XsCAJ6GHRZ[$IhSzBIU]]845Y'KK	"	 % 	)
**,
))%0((*R]^ 	C./EOOEO,  ./  EYu(<(<=QFM 23!!&-"2FLLAQFM!$4 56!!&-"21"5tyyA[44BB#C[^A.77EEG!!&-"<"<cjjIWfm&@&@&E&EF  1 \s    -Kc                f   [          S3n[          S3n[        R                  " SSS0S9n[        R                  " USSS	.S9n	UR                  U	5        [        R                  " USS0S9n
UR                  U
5        S
nS/n[        R
                  " SS9n[        R
                  " SS9n[        R                  " S5      Ul        [        R
                  " SS9Ul	        S Ul
        SUl	        SUl	        S[        R
                  " SS90Ul	        SUR                  0n[        R                  " XXU5      nU R                  UU5        UR                  XS9  UR                  X5        UR                  UR                  SS9  UR                  R                  R                  SUR                  S   5        g)z
measureFromElement(): test 3a
    - there is one part
    - there is a <staffDef> which has its required @n attribute

mocked: staffFromElement(), staffDefFromElement, stream.Measure(),
_correctMRestDurs(), _makeBarlines(),
r  r  r}  r6  r7  r   rz   r  )r6  linesr  r#   r  r  r  	Measure 1c                    U$ r"  r#  r  s     r'   r'  (Test.testMeasureUnit3a.<locals>.<lambda>P  r  r*   NstaffFromElement() return valuer
   SomeClefr  r  r  r   )r   rI   rJ   r<  r   rH   r   r  r  rL   r+  r   r  r  rP   insert)r%   r  r  r  r  r  r  staffDefTagr   staffDefElem	staffElemr  r  r#   r  rf   r&   s                    r'   testMeasureUnit3aTest.testMeasureUnit3a1  s    XU#)}}YT{;}}[sS9QRL!MM(C:>	I	U
^^6
nn-8"*"3"3C"8#'>>{#C 'B$'+$#D '-t~~:/N&O#112((*R]^Xv.++I+M..|H++K,D,DR+P  ''??''/	1r*   c                x   [          S3n[          S3n[        R                  " SSS0S9n[        R                  " USS0S9n	UR                  U	5        [        R                  " USS	0S9n
UR                  U
5        S
nS	/n[        R
                  " SS9n[        R
                  " SS9n[        R                  " S5      Ul        [        R
                  " SS9Ul	        S Ul
        SUl	        SUl	        S	UR                  0n[        R                  " XXU5      nU R                  UU5        UR                  XS9  UR                  UR                  SS9  U R                  SUR                  R                   R"                  5        UR$                  R                  [        R&                  R)                  SS5      5        g)z
measureFromElement(): test 3b
    - there is one part
    - there is a <staffDef> which does not have its required @n attribute

mocked: staffFromElement(), environLocal, stream.Measure(),
_correctMRestDurs(), _makeBarlines(),
r  r  r}  r6  r7  r   r  r  rz   r  r#   r  r  r  r  c                    U$ r"  r#  r  s     r'   r'  (Test.testMeasureUnit3b.<locals>.<lambda>  r  r*   Nr  r  r  r  r   
<staffDef>@n)r   rI   rJ   r<  r   rH   r   r  r  rL   r+  r   r  r  rP   r-   r  r  rk  _UNIMPLEMENTED_IMPORTr>   )r%   rl  r  r  r  r  r  r  r   r  r  r  r  r#   r  rf   r&   s                    r'   testMeasureUnit3bTest.testMeasureUnit3bg  s    XU#)}}YT{;}}['3HL!MM(C:>	I	U
^^6
nn-8"*"3"3C"8#'>>{#C 'B$'+$#D 112((*R]^Xv.++I+M++K,D,DR+PK44;;FFG00&&--lDA	Cr*   c           
         [          S3n[          S3n[          S3n[          S3n[        R                  " S5      nUR                  [        R                  " USSSS	S
.S95        [        R                  " USS0S9n[        R                  " USS0S9nUR                  [        R                  " U5      5        UR                  U5        UR                  U5        SnS/n	[        R
                  " 5       n
[        R                  " S5      n[        R                  " XXXU5      nU R                  S/[        UR                  5       5      5        U R                  XS   R                  5        U R                  S[        US   5      5        SnSnUS    HI  n[        U[         R"                  5      (       a  SnM&  [        U[$        R&                  5      (       d  MG  SnMK     U R)                  U5        U R)                  U5        g)a9  
measureFromElement(): test 3
    - there is one part
    - there is a <staffDef> which has its required @n attribute

NB: I won't bother making an integration equivalent to unit test 3b, since I would have to
    mock "environLocal" to know whether it worked, and "no mocks" is the whole point of this

no mocks
r  r  r   r  r}  rz   r  r   r  )r6  r  r  r  r   r6  r  r  r{  FTN)r   rI   rJ   r<  r   r$   r   r  r   r  r-   r   r  r>  r  
isinstancer   r  r
   BassClefr  )r%   r  r  r  r  r   
innerStaff
innerLayerr  r  r#   r  r&   
foundVoice	foundClefitems                   r'   testMeasureIntegration3Test.testMeasureIntegration3  s    XU#XU#HD/)}}Y'EMM+C#DGWZ7\ ] 	^]]8S#J?
]]8S#J?
%--01*%J	U
**,
))%0((*R]^ 	#V[[] 343K$6$67Cs,-
	3KD$--!
D$--00 		  
 	
#	"r*   z!music21.mei.base.sectionScoreCorec           	     ^   SUl         [        R                  " S5      n/ SQn[        R                  " S5      n[
        R                  " 5       nSn[        R                  " 5       nUR                   n[        R                  " X#UXVU5      n	U R                  X5        UR                  UUUUUUS9  g)z9
Mock sectionScoreCore(). This is very straight-forward.
rD   sectionr~  z12/8r  r  nextMeasureLeftbackupMeasureNumN)rL   rI   rJ   r   r  r	   r  r   r$   r   sectionFromElementr-   rP   )
r%   mockCorer   	allPartNsr  r  r  r#   rf   r&   s
             r'   testSection1Test.testSection1  s    
 !"}}Y'#	))&1**,**,
((((+)8JX 	*(()2)35@9H:J 	) 	Lr*   z music21.mei.base.allPartsPresentzmusic21.stream.Partzmusic21.stream.Scorec                @  ^ [         R                  " S5      nSS/Ul        SS/SS/S.S	S
S4Ul        S Ul        [        R
                  " 5       n[        R
                  " 5       Ul        [        R
                  " 5       n[        R
                  " 5       Ul        Xg/mU4S jUl        [        R
                  " [        R                  S9nXg/ /n	[        R                  " XX5      n
U R                  X5        UR                  U5        UR                  XTR                  US9  UR                  Xg/5        U R                  SUR                  R                  5        U R                  SUR                  R                  5        UR                  R                  S5        UR                  R                  S5        UR                  R                  S5        UR                  R                  S5        U R                  UR                   5        U R                  UR                   5        g)z
scoreFromElement(): unit test with all basic functionality

It's two parts, each with two things in them.

Mocks on allPartsPresent(), sectionScoreCore(), stream.Part(), and stream.Score().
rG   rz   rS  z1-1z1-2z2-1z2-2r  r  r  thingsc                    U S   U S   /$ )Nr   r   r#  rq  s    r'   r'  %Test.testScoreUnit1.<locals>.<lambda>  s    1Q41,r*   c                 &   > T R                  S5      $ r  r  )mockPartReturnss   r'   r'  r     s    ':':1'=r*   rB   r  r{  N)rI   rJ   rL   r+  r   rH   r<  r   r$   r   scoreFromElementr-   rP   r  r  r4  atSoundingPitch)r%   	mockScoremockPartr  mockAllPartsr   	mockPart1	mockPart2r#   rf   r&   r  s              @r'   testScoreUnit1Test.testScoreUnit1  s    }}W%%(#J!(-u~UEN!K!('8!= 6	NN$	>>+	NN$	>>+	$0=^^W-B-BC
"-&&t8*,,T2((/H/HU_(`))9*@AI,,778I,,778((/((/((/((/223223r*   c                *   Sn[         R                  " U5      n[        R                  " 5       n[        R
                  " X5      nU R                  S[        UR                  5      5        U R                  S[        U5      5        U R                  S[        UR                  S   5      5        U R                  S[        UR                  S   5      5        U R                  UR                  S   R                  5        U R                  UR                  S   R                  5        U R                  UR                  S   S   [        R                  5        U R                  UR                  S   S   [        R                  5        U R                  S[        UR                  S   S   5      5        U R                  S[        UR                  S   S   5      5        U R                  UR                  S   S   S   [        R                  5        U R                  UR                  S   S   S   [        R                  5        U R                  S[        UR                  S   S   S   5      5        U R                  S[        UR                  S   S   S   5      5        U R                  UR                  S   S   S   S   [        R                   5        U R                  SUR                  S   S   S   S   R"                  5        U R                  SUR                  S   S   S   S   R$                  5        U R                  UR                  S   S   S   S   [        R                   5        U R                  SUR                  S   S   S   S   R"                  5        U R                  SUR                  S   S   S   S   R$                  5        U R                  UR                  S   S   S   S   [        R                   5        U R                  S	UR                  S   S   S   S   R"                  5        U R                  S
UR                  S   S   S   S   R$                  5        U R                  UR                  S   S   S   [&        R(                  5        U R                  UR                  S   S   S   [*        R,                  5        U R                  SUR                  S   S   S   R.                  5        U R                  UR                  S   S   S   [&        R0                  5        U R                  UR                  S   S   S   [*        R,                  5        U R                  SUR                  S   S   S   R.                  5        g)zr
scoreFromElement(): integration test with all basic functionality

It's two parts, each with two things in them.
a  <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8">
                <staffGrp>
                    <staffDef n="1" clef.shape="G" clef.line="2"/>
                    <staffDef n="2" clef.shape="F" clef.line="4"/>
                </staffGrp>
            </scoreDef>
            <section>
                <measure>
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="2" slur="1i"/>
                            <note pname="A" oct="4" dur="2" slur="1t"/>
                        </layer>
                    </staff>
                    <staff n="2">
                        <layer n="1">
                            <note pname="G" oct="2" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </score>r{  r|  r   r   G4rj  A4G2r  r  N)rI   r2  r   r$   r   r  r-   r  partsr4  r  r!   r   r  r  r   rn  rh  ri  r
   r  r   r  r   r  r  s       r'   testScoreIntegration1Test.testScoreIntegration1  su   . %**,
&&t8 	C-.CK(CQ01CQ01a889a889fll1oa0&..Afll1oa0&..ACQ 234CQ 234fll1oa03V\\Bfll1oa03V\\BCQ 21 567CQ 21 567fll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03A6		Bv||Aq1!4Q7FFGfll1oa03A6DDEfll1oa03T__Efll1oa03U5H5HIQ 21 5 A ABfll1oa03T]]Cfll1oa03U5H5HIQ 21 5 A ABr*   z#music21.mei.base.measureFromElementz#music21.mei.base.sectionFromElementz$music21.mei.base.scoreDefFromElementc           	     ,   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R                  " [        R
                  S9nSn	Sn
[        R                  " [        R                  S9/nSU0XU	4Ul        [        R                  " [        R
                  S9nU/SS0S.Ul        SS	0Ul        SU/0nXX4n[        R                  " XWU5      nU R                  X5        U R                  S
UR                  5        UR                  [        R                  UUSS
US9  U R                  [         S3UR                   S
   S
   S
   R"                  5        UR                  [        R                  U5        U R                  [         S3UR                   S
   S
   S
   R"                  5        UR                  [        R                  U5        U R                  [         S3UR                   S
   S
   S
   R"                  5        U R                  SUS
   R$                  R                  5        US
   R$                  R'                  SU5        US
   R$                  R'                  SS5        US
   R$                  R'                  SS	5        g)a  
sectionScoreCore(): everything basic, as called by scoreFromElement()
    - no keywords
        - and the <measure> has no @n; it would be set to "1" automatically
    - one of everything (<section>, <scoreDef>, and <staffDef>)
    - that the <measure> in here won't be processed (<measure> must be in a <section>)
    - things in a <section> are appended properly (different for <score> and <section>)

mocked:
    - measureFromElement()
    - sectionFromElement()
    - scoreDefFromElement()
    - staffDefFromElement()
  <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8"/>
            <staffDef n="1" clef.shape="G" clef.line="2"/>
            <measure/>
            <section>
                <measure>
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </score>rz   rB   r   barline for the next Measurewhateverr  r-  rz   treble clefr   Nr  r  r  r#   r  scoreDefr  r|  r  )rI   r2  r   rH   r   r  r   rM   rL   r   sectionScoreCorer-   r  rP   r  r   rs  r.   r  r  )r%   mockStaffDFEmockScoreDFEmockSectionFEmockMeasureFEr   r#   r  expActiveMeterexpMeasureNum	expNMLeftexpPart1scoreDefActiveMeterrf   r&   s                  r'   testCoreUnit1Test.testCoreUnit1X  s_   * %^^%
E	1D1DE2	NNFMM:;'*Ho&4&P" #nne6I6IJ:M9N+5u*=%?! &0$?!($iG&&t
C 	*M445--dhh.7:M>B?@9C 	. 	E 	F87+]-I-I!-LQ-OPQ-R-V-VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VWHQK..99:**30CD**36**3>r*   c                N   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R
                  " XU5      u  pEpgU R                  SUR                  5        U R                  U5        U R                  SU5        U R                  S[        U5      5        U R                  SU;   5        U R                  S[        US   5      5        US   S   S   nU R                  U[        R                  5        U R                  SUR                  5        U R                  S[        U5      5        Sn	Sn
SnU R                  X   [        R                  5        U R                  S[        X   5      5        U R                  X   S   [         R"                  5        U R                  SX   S   R$                  5        U R                  X   [&        R(                  5        U R                  X   [*        R,                  5        U R                  SX   R                  5        g	)
a  
sectionScoreCore(): everything basic, as called by scoreFromElement()
    - no keywords
        - and the <measure> has no @n; it would be set to "1" automatically
    - one of everything (<section>, <scoreDef>, and <staffDef>)
    - that the <measure> in here won't be processed (<measure> must be in a <section>)
    - things in a <section> are appended properly (different for <score> and <section>)
r  rz   r  r   r   r|  r{  r  NrI   r2  r   r$   r   r  r-   r   r>  r  r  r!   r   r  r>  r  r   rn  rh  r
   r  r   r  r%   r   r#   r  parsedr  r  r  r  	clefIndextimeSigIndex
voiceIndexs               r'   testCoreIntegration1Test.testCoreIntegration1  s    %**,
E	AEAVAVZB)>_ 	 7 78/*,-CK(v&Cs,-c{1~a dFNN3DKK(CI&	
d.=C 012d.q1499=t/2AABdot?d0%2E2EF 2 > >?r*   c           	        Sn[         R                  " U5      n[        R                  " 5       nS/n[        R                  " [        R
                  S9nSU0Ul        [        R                  " [        R                  S9n	Sn
Sn[        R                  " [        R
                  S9/nSU0XU
4Ul        [        R                  " [        R                  S9nU/SS0S.Ul        SS	0Ul        SXS
   /0nXX4n[        R                  " XWU5      nU R                  X5        UR                  [        R                  SUUUS9  UR                  [        R                  UUSSUS9  U R                  [         S3UR                  S
   S
   S
   R                   5        UR                  [        R                  U5        U R                  [         S3UR                  S
   S
   S
   R                   5        UR                  [        R                  U5        U R                  [         S3UR                  S
   S
   S
   R                   5        U R                  SUR"                  R$                  5        U R                  S
US
   R"                  R$                  5        UR"                  R'                  SU5        UR"                  R'                  SS5        UR"                  R'                  SS	5        g)a  
sectionScoreCore(): everything basic, as called by sectionFromElement()
    - no keywords
        - but the <measure> elements do have @n so those values should be used
    - one of most things (<section>, <scoreDef>, and <staffDef>)
    - two of <measure> (one in a <section>)
    - things in a <section> are appended properly (different for <score> and <section>)

This test is roughly equivalent to testCoreUnit1()
but with a <section> instead of a <score>.
Note that, because the <measure> *should* be processed here, this test is indeed more
complicated.

mocked:
    - measureFromElement()
    - sectionFromElement()
    - scoreDefFromElement()
    - staffDefFromElement()
  <section xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef meter.count="8" meter.unit="8"/>
            <staffDef n="1" clef.shape="G" clef.line="2"/>
            <measure n="400">
                <staff n="1">
                    <layer n="1">
                        <note pname="E" oct="7" dur="1"/>
                    </layer>
                </staff>
            </measure>
            <section>
                <measure n="92">
                    <staff n="1">
                        <layer n="1">
                            <note pname="G" oct="4" dur="1"/>
                        </layer>
                    </staff>
                </measure>
            </section>
        </section>rz   rB   r   r  r  r  r  r  r   )r#   r  Nr  r  r  r  r|  r  )rI   r2  r   rH   r   rM   rL   r   r  r   r  r-   rP   r  r   rs  r.   r  r  r  )r%   r  r  r   r!  r   r#   r  expMeas1r"  r#  r$  r%  r&  rf   r&   s                   r'   testCoreUnit2Test.testCoreUnit2  s   4( %^^%
E	>>6==9&)8_"1D1DE2	NNFMM:;'*Ho&4&P" #nne6I6IJ:M9N+5u*=%?! &0$?!(QK01iG&&t
C 	*--dhh99C:M 	. 	O 	--dhh.7:M>B @A9C 	. 	E 	F87+]-I-I!-LQ-OPQ-R-V-VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW,,TXXzBF88,l.I.I!.LQ.OPQ.R.V.VW 	HOO667HQK..99:''-@A''U3''];r*   c                $   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R
                  " XU5      u  pEpgU R                  SUR                  5        U R                  U5        U R                  SU5        U R                  S[        U5      5        U R                  SU;   5        U R                  S[        US   5      5        US   S   nSn	Sn
SnU R                  U[        R                  5        U R                  SUR                  5        U R                  S[        U5      5        U R                  X   [        R                  5        U R                  S[        X   5      5        U R                  X   S   [         R"                  5        U R                  S	X   S   R$                  5        U R                  X   [&        R(                  5        U R                  X   [*        R,                  5        U R                  SX   R                  5        US   S   nSn	Sn
SnU R                  U[        R                  5        U R                  S
UR                  5        U R                  S[        U5      5        U R                  US   [        R                  5        U R                  S[        US   5      5        U R                  US   S   [         R"                  5        U R                  SUS   S   R$                  5        g)ao  
sectionScoreCore(): everything basic, as called by sectionFromElement()
    - no keywords
        - but the <measure> elements do have @n so those values should be used
    - one of most things (<section>, <scoreDef>, and <staffDef>)
    - two of <measure> (one in a <section>)
    - things in a <section> are appended properly (different for <score> and <section>)
r3  rz   r  r{  r   r   r  r|  E7\   r  Nr*  r+  s               r'   testCoreIntegration2Test.testCoreIntegration2F  s   ( %**,
E	AEAVAVZB)>_ 	 7 78/*,-CK(v&Cs,- c{1~	
dFNN3dkk*CI&d.=C 012d.q1499=t/2AABdot?d0%2E2EF 2 > >?c{1~	
dFNN3T[[)CI&d1gv||4CQL)d1gaj$))4tAwqz889r*   c           	        Sn[         R                  " U5      n[        R                  " 5       nS/n[        R                  " [        R
                  S9nSn	Sn
[        R                  " [        R                  S9nSU0Ul        UnSnU
S-   nSU/0nXX4n[        R                  " XWXhU	U
S	9nU R                  UU5        UR                  [        R                  U
S-   UUUS
9  U R                  SUR                  5        U R                  SUR                  5        U R                  SUR                  5        U R                  U	US   S   S   R                  5        g)a  
sectionScoreCore(): everything basic, as called by sectionFromElement()
    - all keywords
        - and the <measure> has no @n; it should use the backupNum
        - activeMeter = a MagicMock (we expect this returned)
        - nextMeasureLeft = 'next left measure' (expected in the Measure)
        - backupMeasureNum = 900 (expected in the Measure)

mocked:
    - measureFromElement()
    - sectionFromElement()
    - scoreDefFromElement()
    - staffDefFromElement()
&  <section xmlns="http://www.music-encoding.org/ns/mei">
            <measure>
                <staff n="1">
                    <layer n="1">
                        <note pname="G" oct="4" dur="1"/>
                    </layer>
                </staff>
            </measure>
        </section>rz   rB   znext left measurer  )	spect_setNr   r  r  r#   r   )rI   r2  r   rH   r   r  r   rM   rL   r   r  r-   rP   r  r  r  )r%   r  r  r   r!  r   r#   r  r  r  r  r4  r"  r$  r#  rf   r&   s                    r'   testCoreUnit3Test.testCoreUnit3  sT   * %^^%
E	nne.A.AB->>FMM:&)8_"$	(1,($iG&&t
7F8HJ
 	6*--dhh.>.B.7:E9C	 	. 	E 	M445L334L334&)C.*;*G*GHr*   c           	        Sn[         R                  " U5      n[        R                  " 5       nS/n[        R
                  " S5      n[        R                  " S5      nSn[        R                  " UUUUUUS9u  ptpVU R                  SUR                  5        U R                  U5        U R                  SU5        U R                  S[        U5      5        U R                  SU;   5        U R                  S[        US   5      5        US   S	   nS	n	Sn
U R                  U[         R"                  5        U R                  SUR$                  5        U R                  S
[        U5      5        U R                  X   [         R&                  5        U R                  S[        X   5      5        U R                  X   S	   [(        R*                  5        U R                  SX   S	   R,                  5        U R                  X   [        R                  5        U R                  SX   R.                  5        U R1                  X   UR2                  5        g)ab  
sectionScoreCore(): everything basic, as called by sectionFromElement()
    - all keywords
        - and the <measure> has no @n; it should use the backupNum
        - activeMeter = a MagicMock (we expect this returned)
        - nextMeasureLeft = 'next left measure' (expected in the Measure)
        - backupMeasureNum = 900 (expected in the Measure)
r=  rz   r  r  r  r  i  r   r   r{  r  N)rI   r2  r   r$   r   r  r	   r  r   r  r-   r   r>  r  r  r!   r   r  r>  r  r   rn  rh  r  rO   r  )r%   r   r#   r  r  r  r  r,  r  repeatIndexr/  s              r'   testCoreIntegration3Test.testCoreIntegration3  s    %**,
E	))%0**W-AEAVAV#+-B/>_ 	 7 78/*./CK(v&Cs,-c{1~
dFNN3dkk*CI&d.=C 012d.q1499=t/2AABd/<$"3"="=>d')9)9:r*   c                   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R                  " [        R
                  S9n	[        R                  " [        R                  S9n
XS.Ul        [        R                  " [        R                  S9nSU0Ul        UnU
nSnSU	/0nXX4n[        R                  R                  [         S3[         S35      n[        R                  " XhU5      nU R!                  UU5        UR"                  R%                  U5        [        R&                  R                  S	S
5      nUR(                  R%                  U5        UR%                  [        R*                  SUUUS9  U R!                  SUR,                  5        U R!                  SUR,                  5        UR%                  [        R*                  U5        g)a  
sectionScoreCore(): as called by sectionFromElement()
    - there's an "rptboth" barline, so we have to return a "nextMeasureLeft"
    - the <staffDef> gives a TimeSignature, so we have to change "activeMeter" (and return)
    - there's a <staffDef> without @n attribute, so we have to warn the user about it
    - there's an unknown element, so we have to debug-warn the user

mocked:
    - measureFromElement()
    - sectionFromElement()
    - scoreDefFromElement()
    - staffDefFromElement()
    - environLocal
  <section xmlns="http://www.music-encoding.org/ns/mei">
            <bogus>5</bogus>  <!-- this will be ignored -->
            <staffDef n="1" meter.count="6" meter.unit="8"/>
            <staffDef key.accid="3s" key.mode="minor"/>  <!-- this will be ignored -->
            <measure n="42" right="rptboth">
                <staff n="1"><layer n="1"><note pname="G" oct="4" dur="1"/></layer></staff>
            </measure>
        </section>rz   rB   )rz   r  r   r   bogusr  r  r  r?  r   N)rI   r2  r   rH   r   rM   r	   r  rL   r   r  r   rO  r>   r   r  r-   rP  rP   r  rk  r  r  )r%   r  r  r   r!  rl  r   r#   r  r4  	expRepeatexpMeterr"  r$  r#  rf   expPrintDebugr&   rm  s                      r'   testCoreUnit4Test.testCoreUnit4  s   , %^^%
E	 >>6==9NNCJJ7	+3%M">>5+>+>?%,h$7!!	($iG44;;vhe<L?Ehg<NP&&t
C 	6*66}E,,33L$G009--dhh./.7:H9C	 	. 	E 	M445L334,,TXXzBr*   c                V   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R
                  " UUU5      u  pVpx[        R                  R                  SS5      n	UR                  R                  U	5        U R                  SUR                  5        U R                  U[        R                  5        U R                  SU5        U R                  S[        U5      5        U R!                  SU;   5        U R                  S[        US   5      5        US   S   n
SnSnSnU R                  U
["        R$                  5        U R                  S	U
R&                  5        U R                  S
[        U
5      5        U R                  X   ["        R(                  5        U R                  S[        X   5      5        U R                  X   S   [*        R,                  5        U R                  SX   S   R.                  5        U R                  X   [0        R2                  5        U R                  SX   R                  5        U R                  X   [        R                  5        U R                  SX   R4                  5        U R7                  X   U
R8                  5        g)az  
sectionScoreCore(): as called by sectionFromElement()
    - there's an "rptboth" barline, so we have to return a "nextMeasureLeft"
    - the <staffDef> gives a TimeSignature, so we have to change "activeMeter" (and return)
    - there's a <staffDef> without @n attribute, so we have to warn the user about it
    - there's an unknown element, so we have to debug-warn the user
rG  rz   r  r  6/8r   r   r{  r  r|  r  r  N)rI   r2  r   r$   r   r  r  r>   rk  rP   r-   r   r!   r	   r  r  r  r   r  r>  r  r   rn  rh  r   r  r  rO   r  )r%   rl  r   r#   r  r,  r  r  r  rm  r  r.  r/  rC  s                 r'   testCoreIntegration4Test.testCoreIntegration4W  s2    %**,
E	AEAVAVW[W`WaBc>_ ,,33L$G009 	 7 78oszz:,-CK(v&Cs,-c{1~
dFNN3T[[)CI&d.=C 012d.q1499=t/2AABd0%2E2EF 2 > >?d/< 1 ; ;<d'):):;r*   c                <   Sn[         R                  " U5      n[        R                  " 5       nS/n[        R
                  " UUU5      u  pEpgU R                  SUR                  5        U R                  U5        U R                  SU5        U R                  S[        U5      5        U R                  SU;   5        U R                  S[        US   5      5        US   S   S   nU R                  U[        R                  5        US   S   S   n	Sn
SnSnSnU R                  U	[        R                  5        U R                  SU	R                   5        U R                  S	[        U	5      5        U R                  X   [        R"                  5        U R                  S[        X   5      5        U R                  X   S   [$        R&                  5        U R                  S
X   S   R(                  5        U R                  X   [*        R,                  5        U R                  X   [.        R0                  5        U R                  SX   R2                  5        U R                  SX   R4                  5        U R                  X   [6        R8                  5        U R                  SX   R                  5        US   S   S   n	U R                  U	[        R                  5        U R                  SU	R                   5        U R                  S[        U	5      5        U R                  U	S   [        R"                  5        U R                  S[        U	S   5      5        U R                  U	S   S   [$        R&                  5        U R                  SU	S   S   R(                  5        g)a?  
sectionScoreCore(): as called by scoreFromElement()

With a preposterously embedded set of <section> elements, we have to ensure that
staff-related metadata are cascaded properly into the <measure>

NOTE there is no unit test corresponding to this integration test---this
    is really all about the cumulative effect
aL  <score xmlns="http://www.music-encoding.org/ns/mei">
            <scoreDef key.sig="1f" key.mode="minor">
                <staffGrp>
                    <staffDef n="1" clef.line="4" clef.shape="F"/>
                </staffGrp>
            </scoreDef>
            <staffDef n="1" meter.count="6" meter.unit="8"/>
            <section>
                <staffDef n="1" label="tuba"/>
                <section>
                    <measure n="42">
                        <staff n="1"><layer n="1"><note pname="C" oct="1" dur="1"/></layer></staff>
                    </measure>
                </section>
            </section>
            <section>
                <measure n="402">
                    <staff n="1"><layer n="1"><note pname="C" oct="2" dur="1"/></layer></staff>
                </measure>
            </section>
        </score>rz   rO  r{  r   r   r|  r  r   C1r   i  r  N)rI   r2  r   r$   r   r  r-   r   r>  r  r  r!   r   rn  r   r  r>  r  r   rn  rh  r
   r  r   r   r   r   r   r  )r%   r   r#   r  r,  r  r  r  instrr  r-  keysigIndextimesigIndexr/  s                 r'   testCoreIntegration5Test.testCoreIntegration5  s    * %**,
E	AEAVAVW[W`WaBc>_
 	 7 78/*,-CK(v&Cs,-sAq!eZ__5c{1~a 	
dFNN3T[[)CI&d.=C 012d.q1499=t/2AABdot}}=d/1A1ABT.556$"3"8"89d0%2E2EF 2 > >?c{1~a dFNN3dkk*CI&d1gv||4CQL)d1gaj$))4tAwqz889r*   c                    [         R                  " SSS0S9n[        R                  " U5      nU R	                  U[
        R                  5        U R                  SUR                  5        g)z-
barLineFromElement(): <barLine rend="dbl"/>
barLinerendr  r   r  N	rI   rJ   r   barLineFromElementr!   r	   r  r-   r  r   s      r'   testBarLine1Test.testBarLine1  sP     }}Y?((.fckk26;;/r*   c                    [         R                  " S5      n[        R                  " U5      nU R	                  U[
        R                  5        U R                  SUR                  5        g)z"
barLineFromElement(): <barLine/>
r[  regularNr]  r   s      r'   testBarLine2Test.testBarLine2  sJ     }}Y'((.fckk2FKK0r*   c                   Sn[         R                  " U5      nUR                  5       nU R                  S[	        UR
                  S   R                  5       5      5        UR
                  S   R                  5       S   nU R                  U[        R                  5        U R                  UR                  S5        U R                  UR                  R                  S5        g)zj
Ensure that instrument details are imported properly.

There should be one instrument called "Clarinet."
a  <?xml version="1.0" encoding="UTF-8"?>
            <mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="2013">
            <music><score>
                <scoreDef meter.count="8" meter.unit="8">
                    <staffGrp>
                        <staffDef n="1" label="Clarinet" trans.diat="-2" trans.semi="-3">
                            <clef shape="F" line="4"/>
                        </staffDef>
                    </staffGrp>
                </scoreDef>
                <section>
                    <scoreDef key.sig="1f" key.mode="major"/>
                    <measure n="1">
                        <staff n="1">
                            <layer n="1" xml:id="asdf">
                                <note pname="E" oct="2" dur="1"/>
                            </layer>
                        </staff>
                    </measure>
                </section>
            </score></music></mei>
        r   r   r  r   N)r   r   rN   r-   r  r  getInstrumentsr!   r   r  r  r  r   )r%   	meiSourcerX   r&   rU  s        r'   testInstrumentDetailsTest.testInstrumentDetails  s    	, )))4CQ > > @ABQ..03eZ%:%:;4,,995Ar*   c                   SSK Jn  SSK Jn  UR                  5       S-  S-  S-  nUR	                  U5      n[        5       nUR                  5        H8  nU R                  [        U5      XV5        UR                  [        U5      5        M:     g )Nr   )common)	converterr,   testztest_file.mei)
r|  rk  rl  getSourceFilePathparserL  recurseassertNotInr  add)r%   rk  rl  fpr  seen_idsels          r'   testUniqueInstancesTest.testUniqueInstances$  sn    "%%%'%/&8?JOOB5))+BRVX2LLB  r*   r#  N)__name__
__module____qualname____firstlineno__r(   r0   r9   r?   r   patchr[   rg   rk   rs   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r  r  r-  r;  r?  rE  rL  rO  rW  r_  rc  rg  rn  rr  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r
  r  r  r!  r(  r-  r2  r?  rE  rL  rP  rb  rj  rn  ru  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r  r  r!  r%  r(  r:  rB  rH  rT  rX  r\  rb  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r$  r(  r0  r3  r8  r;  rC  rJ  rS  rf  rq  rt  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r*  r.  r1  r7  rB  rI  rQ  rX  r\  r`  rc  rk  rp  rw  rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r'  r0  r5  r:  r@  rD  rL  rP  rX  r_  rc  rh  rv  __static_attributes__r#  r*   r'   r   r   :   s   HH 	Fb 
ZZ+,	ZZ*+	ZZ+,	ZZ-.	ZZ./	ZZ34	ZZ/0@ 1 5 0 / - , -@8	9	999
333	FB	G
4<<<<<<++ 
ZZ124 34 
ZZ671 81	+D	D 
ZZ/0	ZZ23	ZZ./2 0 4 12 
ZZ/0	ZZ23	ZZ./< 0 4 1<&?,/*+7(7$E.66(6( 
ZZ/0: 1:,6(6.	+6 
ZZ23P 4P 
ZZ23X 4X 
ZZ23L 4L 
ZZ23	+ 4	+ 
ZZ23< 4< 
ZZ23< 4< 
ZZ236 46 
ZZ89+ :+ 
ZZ89	+ :	+ 
ZZ89	+ :	+++++=	9	977777///./"18 
ZZ/0[ 1[$ 
ZZ/0X 1X2 
ZZ#$	ZZ;<	ZZ,-	ZZ/0N 1 . = %N62
2 
ZZ#$	ZZ;<	ZZ,-	ZZ/0	ZZ34N 5 1 . = %
NBO$ 
ZZ#$	ZZ;<	ZZ,-	ZZ/0	ZZ12	ZZ/0	ZZ+,K - 1 3 1 . = %K@7( 
ZZ#$	ZZ;<	ZZ,-	ZZ/0	ZZ01	ZZ*+? , 2 1 . = %?B:( 
ZZ#$	ZZ;<	ZZ,-	ZZ/0	ZZ01I 2 1 . = %
I<:2 
ZZ#$	ZZ;<	ZZ,-	ZZ/0	ZZ34+9 5 1 . = %
+9Z5B 
ZZ#$	ZZ/0	ZZ013 2 1 %3*C". C" 
ZZ23
@ 4
@ 
ZZ23, 4, 
ZZ34
6 5
6 
ZZ34, 5,( = = 
ZZ%&	ZZ;<	ZZ/0	ZZ23O 4 1 = 'O48  
ZZ%&	ZZ;<	ZZ/0	ZZ23O 4 1 = 'O<O& 
ZZ%&	ZZ;<	ZZ/0	ZZ23	ZZ12	ZZ/0	ZZ+,L - 1 3 4 1 = 'L<7* 
ZZ%&	ZZ;<	ZZ/0	ZZ23	ZZ01@ 2 4 1 = '
@<:. 
ZZ%&	ZZ;<	ZZ/0	ZZ23	ZZ01I 2 4 1 = '
I6B< 
ZZ-.	ZZ-.	ZZ&'5 ( / /52 
ZZ-.	ZZ-.	ZZ&'5 ( / /5* 
ZZ-.	ZZ-.	ZZ&'5 ( / /5*: : :  
ZZ-.	ZZ-.	ZZ&'0 ( / /02 
ZZ23	ZZ&'	ZZ01+L 2 ( 4+LZ 
ZZ23	ZZ&'	ZZ01$1 2 ( 4$1L 
ZZ23	ZZ&'	ZZ01#F 2 ( 4#FJ:2:,F* 
ZZ34Y 5Y8#<R 
ZZ67	ZZ45	ZZ34	ZZ23	ZZ:;7> < 4 5 6 8
7>t2828 
ZZ/0	ZZ67	ZZ45	ZZ34	ZZ23	ZZ:;1> < 4 5 6 8 11>f20 
ZZ/0	ZZ/0	ZZ67	ZZ45	ZZ34	ZZ23	ZZ:;2> < 4 5 6 8 1 12>hQ0 
ZZ/0	ZZ/0	ZZ67	ZZ45	ZZ34	ZZ23	ZZ:;/ < 4 5 6 8 1 1/&= 
ZZ67; 8;&/(/2 
ZZ45	ZZ34. 5 6..B$ 
ZZ45	ZZ34	ZZ67? 8 5 6?8N:OF  
ZZ/0? 1?(D*R*D. 
ZZ&'D (D2R,+++&7.C*G8C6L2 
ZZ/0Q 1Q, 
ZZ&'$0 ($0N 
ZZ&'	ZZ/0R 1 (R6SDS6 
ZZ/0V 1V,$TN 
ZZ/0= 1=6$ZL;2@" 
ZZ)*E +E4 
ZZ)*D +D0 
ZZ)*? +?( 
ZZ)*D +D4E( 
ZZ;<	ZZ01	ZZ/0H 1 2 =H( 
ZZ;<	ZZ01	ZZ/0H 1 2 =H. 
ZZ;<	ZZ01	ZZ/0H 1 2 =H0
GG,G,G4 
ZZ>?= @= 
ZZ/0A 1A 
ZZ-.< /<* 
ZZ-.< /<4)) ) FKD$ 
ZZ34	ZZ45	ZZ01	ZZ()	ZZ&'<A ( * 2 6 5
<A|8Dt 
ZZ34	ZZ45	ZZ01	ZZ()	ZZ&'<A ( * 2 6 5
<A|0Gd 
ZZ34	ZZ45	ZZ01	ZZ()	ZZ67/1 8 * 2 6 5
/1b 
ZZ34	ZZ45	ZZ01	ZZ()	ZZ/0,C 1 * 2 6 5
,C\,#l 
ZZ34L 5L0 
ZZ23	ZZ34	ZZ%&	ZZ&'$4 ( ' 5 4$4LCCJ 
ZZ56	ZZ56	ZZ67	ZZ67K? 8 8 7 7K?Z5@n 
ZZ56	ZZ56	ZZ67	ZZ67`< 8 8 7 7`<DJ:X 
ZZ56	ZZ56	ZZ67	ZZ67=I 8 8 7 7=I~8;t 
ZZ/0	ZZ56	ZZ56	ZZ67	ZZ67AC 8 8 7 7 1
ACF 
ZZ/05< 15<nO:j01
$BL
! 
!r*   r   __main__)$__doc__
__future__r   unittest	xml.etreer   rI   collectionsr   	fractionsr   r   r|  r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   music21.meir   music21.mei.baser   r   TestCaser   rx  mainTestr#  r*   r'   <module>r     s    # 
 + #   !               # #
tO!8 tO!n_ zT r*   