
    J~j%                         d dl Zd dlmc mZ d dlmZ d dlm	Z	  e	d          Z
d"dZd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d  Z%d! Z&dS )#    N)	state_lib)load_bin_module
led_status	sbs_mjpegc                     dd| iiS )Ncameramode )r	   s    DC:\Users\jvoigtlander\Desktop\BubbleCamCode\tests\test_led_status.pycfgr      s    vtn%%    c            
         t           j        } d}t          |          } | |          }dg}||k    }|s5t          j        d|fd||f          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |           dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j
        |                    d x} x}x}x}x}}d S )
Nr   camera_primary==zy%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.camera_service_names
}(%(py7)s
{%(py7)s = %(py3)s(%(py5)s)
})
} == %(py12)sr   r   py0py2py3py5py7py9py12assert %(py14)spy14r   camera_service_namesr   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation@py_assert1@py_assert4@py_assert6@py_assert8@py_assert11@py_assert10@py_format13@py_format15s           r   0test_camera_service_names_single_combined_streamr0      s   *R{R3{+;+;R**+;<<RAQ@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RRRR:RRRRRR*RRRRRRRRRRR3RRRRR3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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Rr   c            
         t           j        } d}t          |          } | |          }ddg}||k    }|s5t          j        d|fd||f          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |           dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }d	d
|iz  }t          t          j
        |                    d x} x}x}x}x}}d S )Ndual_node_h264camera_leftcamera_rightr   r   r   r   r   r   r   r   r'   s           r   #test_camera_service_names_dual_noder5      s   *d/?d3/?+@+@d**+@AAdmUcEddAEdddddddddddAEddddddddddddd:ddddd:dddddd*ddddddddddd3ddddd3dddddd/?dddd+@ddddAddddEddddddddddddddddddddddddddddddddddddr   c           	         t           j        }t                      } ||          }d}||u }|s"t          j        d|fd||f          dt          j                    v st          j        t                     rt          j        t                     ndt          j        |          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j
        |                    d x}x}x}x}}d S )	NFiszq%(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.recording_confirmed
}(%(py5)s
{%(py5)s = %(py3)s()
})
} is %(py10)sr   r   r   r   r   r   r   py10assert %(py12)sr   )r   recording_confirmedr   r   r    r!   r"   r#   r$   r%   r&   sim_envr(   r)   r*   @py_assert9r+   @py_format11r.   s           r   3test_recording_confirmed_false_when_nothing_runningrB      sf   )9#%%9))%009E90E99999999990E999999999999:99999:999999)99999999999#99999#999999%999909999E999999999999999999999999999999999r   c           	         t          j        dd           t          j        dd           t          j        }t	                      } ||          }d}||u }|s"t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          d	z  }d
d|iz  }t          t          j        |                    d x}x}x}x}}d S )Nr   runningsensorsTr7   r9   r   r   r:   r<   r   r   write_stater   r=   r   r   r    r!   r"   r#   r$   r%   r&   r>   s           r   =test_recording_confirmed_true_when_camera_and_sensors_runningrH      s   *I666)Y///)8#%%8))%008D80D88888888880D888888888888:88888:888888)88888888888#88888#888888%888808888D888888888888888888888888888888888r   c           	         t          j        dd           t          j        }t	                      } ||          }d}||u }|s"t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          dz  }d	d
|iz  }t          t          j        |                    d x}x}x}x}}d S )Nr   rD   Fr7   r9   r   r   r:   r<   r   rF   r>   s           r   5test_recording_confirmed_false_if_only_camera_runningrJ      sz   *I666)9#%%9))%009E90E99999999990E999999999999:99999:999999)99999999999#99999#999999%999909999E999999999999999999999999999999999r   c           
      L   t          j        dd           t          j        dd           t          j        }d}t	          |          } ||          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          d	t          j                    v st          j	        t                    rt          j
        t                    nd	t          j
        |          t          j
        |          t          j
        |          t          j
        |          d
z  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}t          j        dd           t          j        }d}t	          |          } ||          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          d	t          j                    v st          j	        t                    rt          j
        t                    nd	t          j
        |          t          j
        |          t          j
        |          t          j
        |          d
z  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nr3   rD   rE   dual_node_mjpegFr7   )zx%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.recording_confirmed
}(%(py7)s
{%(py7)s = %(py3)s(%(py5)s)
})
} is %(py12)sr   r   r   r   r   r4   TrF   	r?   r(   r)   r*   r+   r,   r-   r.   r/   s	            r   @test_recording_confirmed_requires_both_camera_nodes_in_dual_moderN   "   sA   -333)Y///)J.?J#.?*@*@J))*@AAJUJAUJJJJJJJJJJAUJJJJJJJJJJJJ:JJJJJ:JJJJJJ)JJJJJJJJJJJ#JJJJJ#JJJJJJ.?JJJJ*@JJJJAJJJJUJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ.)444)I.?I#.?*@*@I))*@AAITIATIIIIIIIIIIATIIIIIIIIIIII:IIIII:IIIIII)IIIIIIIIIII#IIIII#IIIIII.?IIII*@IIIIAIIIITIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIr   c           
      j   t          j        dd           t          j        dd           t          j        dd           t          j        }t	                      }d} |||          }d}||u }|s5t          j        d|fd	||f          d
t          j                    v st          j	        t                    rt          j
        t                    nd
t          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nr   rD   rE   watchdog   stale_afterFr7   z%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.any_mission_critical_error
}(%(py5)s
{%(py5)s = %(py3)s()
}, stale_after=%(py7)s)
} is %(py12)sr   r   r   r   r   r   rG   r   any_mission_critical_errorr   r   r    r!   r"   r#   r$   r%   r&   rM   s	            r   2test_any_mission_critical_error_false_when_healthyrW   *   s   *I666)Y///*i0000PPBP00BGGGP5PG5PPPPPPPPPPG5PPPPPPPPPPPP:PPPPP:PPPPPP0PPPPPPPPPPPPPPPPPPPPPPPPPPBPPPPGPPPP5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr   c           
      D   t          j        dd           t          j        ddd           t          j        }t	                      }d} |||          }d	}||u }|s5t          j        d
|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nr   rD   rE   errorfaultdetailrQ   rR   Tr7   rT   r   r   r   r   r   rU   rM   s	            r   4test_any_mission_critical_error_true_on_sensor_faultr]   1   s   *I666)WW====0OOBO00BGGGO4OG4OOOOOOOOOOG4OOOOOOOOOOOO:OOOOO:OOOOOO0OOOOOOOOOOOOOOOOOOOOOOOOOOBOOOOGOOOO4OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr   c           
         t          j        dd           t          j        dd           t          j        ddd           t          j        ddd	           t          j        }t	                      }d
} |||          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nr   rD   rE   epaperrY   z
spi glitchr[   lumenz
pwm glitchrQ   rR   Fr7   rT   r   r   r   r   r   rU   rM   s	            r   <test_epaper_or_lumen_faults_do_not_count_as_mission_criticalra   7   s    *I666)Y///(GLAAAA'7<@@@@0PPBP00BGGGP5PG5PPPPPPPPPPG5PPPPPPPPPPPP:PPPPP:PPPPPP0PPPPPPPPPPPPPPPPPPPPPPPPPPBPPPPGPPPP5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr   c           
         t          j        ddd           t          j        ddd           t          j        d	d           t          j        d
d           t          j        }t	                      }d} |||          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nrecord_switchrD   Frecording_requestedr   rY   zstopped by switchr[   rE   rP   rQ   rR   r7   rT   r   r   r   r   r   rU   rM   s	            r   <test_camera_fault_not_mission_critical_when_switch_says_stoprf   A   s    /9%PPPP*G<OPPPP)Y///*i0000PPBP00BGGGP5PG5PPPPPPPPPPG5PPPPPPPPPPPP:PPPPP:PPPPPP0PPPPPPPPPPPPPPPPPPPPPPPPPPBPPPPGPPPP5PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPr   c           
         t          j        ddd           t          j        ddd           t          j        d	d           t          j        d
d           t          j        }t	                      }d} |||          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nrc   rD   Trd   r   rY   z
real faultr[   rE   rP   rQ   rR   r7   rT   r   r   r   r   r   rU   rM   s	            r   9test_camera_fault_still_critical_while_switch_says_recordrh   K   s   /9$OOOO*GLIIII)Y///*i0000OOBO00BGGGO4OG4OOOOOOOOOOG4OOOOOOOOOOOO:OOOOO:OOOOOO0OOOOOOOOOOOOOOOOOOOOOOOOOOBOOOOGOOOO4OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr   c           
      H   t          j        ddd           t          j        ddd           t          j        }t	                      }d	} |||
          }d}||u }|s5t          j        d|fd||f          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          dt          j                    v st          j	        t                    rt          j
        t                    ndt          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}x}x}}d S )Nrc   rD   Frd   rE   rY   rZ   r[   rQ   rR   Tr7   rT   r   r   r   r   r   rU   rM   s	            r   /test_sensor_fault_critical_regardless_of_switchrj   S   s   /9%PPPP)WW====0OOBO00BGGGO4OG4OOOOOOOOOOG4OOOOOOOOOOOO:OOOOO:OOOOOO0OOOOOOOOOOOOOOOOOOOOOOOOOOBOOOOGOOOO4OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOr   c                     ddl m}  d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    d x}x}x}}d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    d x}x}x}}d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    d x}x}x}}d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }d	d
|iz  }t          t          j	        |                    d x}x}x}}d S )Nr   )swap_rg   r   r   )r   rn   r   r   z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srl   r   r   py4r   assert %(py9)sr   )r   r   rn   )
      rQ   )rt   rs   rQ   )
bubblecam.hardware.ws2812brl   r   r    r!   r"   r#   r$   r%   r&   )rl   r(   @py_assert3r*   @py_assert5@py_format8@py_format10s          r   &test_swap_rg_for_rgb_order_first_pixelrz   Y   s     322222.77;.;.;..........;............7.....7......;........;..............................77;.;.;..........;............7.....7......;........;..............................77;.;.;..........;............7.....7......;........;.............................077<  0L0 L0000000000 L0000000000007000007000000<0000 0000L0000000000000000000000000000000r   c                      dddddddS )Ni  i  i	     iH&  )error_blink_on_mserror_blink_off_msidle_blink_on_msidle_blink_off_msheartbeat_blink_on_msheartbeat_blink_off_msr
   r
   r   r   led_cfgr   d   s#     "!!$"&  r   c            
         t                               ddd          } d}| |k    }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd	|iz  }t          t          j	        |                    dx}}t           j        }d}d
} ||| |          }d}||k    }	|	s+t          j        d|	fd||f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    dx}x}x}x}x}	}t                               d| d          } d}| |u }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          dz  }dd	|iz  }t          t          j	        |                    dx}}t           j        }d}d} ||| |          }d}||k    }	|	s+t          j        d|	fd||f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j	        |                    dx}x}x}x}x}	}dS )zRegression guard: confirmed_at must reset when recording stops, or
    a second session in the same boot inherits the first's expired window
    and never shows green.TNg      Y@r   z%(py0)s == %(py3)satr   r   assert %(py5)sr   g      i@)zj%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.next_confirmed_at
}(%(py4)s, %(py5)s, %(py7)s)
} == %(py12)sr   r   r   rq   r   r   r   r   r   r   Fg     r@r7   )z%(py0)s is %(py3)sg     @@)
r   next_confirmed_atr   r    r!   r"   r#   r$   r%   r&   )r   @py_assert2r(   @py_format4@py_format6rv   r*   r+   r,   r-   r.   r/   s               r   1test_green_window_restarts_each_recording_sessionr   o   s   
 
	%	%dD%	8	8B2;222'AA%A''b%88AEA8EAAAAAAAAAA8EAAAAAAAAAAAA:AAAAA:AAAAAA'AAAAAAAAAAAAAAAbAAAAAbAAAAAA%AAAA8AAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA		%	%eR	7	7B2:222'CC&C''b&99CVC9VCCCCCCCCCC9VCCCCCCCCCCCC:CCCCC:CCCCCC'CCCCCCCCCCCCCCCbCCCCCbCCCCCC&CCCC9CCCCVCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCr   c            
         t           j        } d}t                      } | ||          }t           j        ddf}||k    }|s5t	          j        d|fd||f          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}}t           j        } d}t                      } | ||          }t           j        ddf}||k    }|s5t	          j        d|fd||f          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}}t                               dt                                \  }}	}
g } t           j        }||k    }|}|r
d}|
|k    }|}|st	          j        d|fd||f          dt          j                    v st	          j        |          rt	          j	        |          nddt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |          dz  }dd|iz  }|                     |           |rt	          j        d|fd|
|f          dt          j                    v st	          j        |
          rt	          j	        |
          ndt	          j	        |          dz  }dd|iz  }|                     |           t	          j        | d          i z  }dd|iz  }t          t	          j        |                    d x}x} x}x}x}}t           j        } d}t                      } | ||          }t           j        ddf}||k    }|s5t	          j        d|fd||f          dt          j                    v st	          j        t                     rt	          j	        t                     ndt	          j	        |           t	          j	        |          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x} x}x}x}x}}d S )NrY   g      ?g      @r   )zr%(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.pattern_for
}(%(py4)s, %(py7)s
{%(py7)s = %(py5)s()
})
} == %(py12)sr   r   r   r   r   redg      @green        )z-%(py2)s == %(py6)s
{%(py6)s = %(py4)s.GREEN
}color)r   rq   py6z%(py8)spy8)z%(py10)s == %(py13)soff_s)r;   py13z%(py15)spy15r   zassert %(py18)spy18	heartbeatg?g#@)r   pattern_forr   BLUEr   r    r!   r"   r#   r$   r%   r&   REDGREENappend_format_boolop)r(   rv   r*   r+   r,   r-   r.   r/   r   on_sr   rw   @py_assert0@py_assert12@py_format7@py_format9@py_format14@py_format16@py_format17@py_format19s                       r   test_pattern_for_each_moder      s   !T'T799T!!'955T*/3PS9TT59TTTTTTTTTTT59TTTTTTTTTTTTT:TTTTT:TTTTTT!TTTT'TTTTTTTTTTT7TTTTT7TTTTTT9TTTT5TTTT9TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT!Q%QQ!!%33Q
S7QQ37QQQQQQQQQQQ37QQQQQQQQQQQQQ:QQQQQ:QQQQQQ!QQQQ%QQQQQQQQQQQQQQQQQQQQQQQQQQ3QQQQ7QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ#//CCE455J$55$$55555#5#555555555555$55555555555555555555555555555555J55555J555555$555555555555555555555555555#55555555555555555555555#5555555555555555555555555555555555555555555555555555555!Y+YwyyY!!+y99Yj>NPSUX=YY9=YYYYYYYYYYY9=YYYYYYYYYYYYY:YYYYY:YYYYYY!YYYY+YYYYYYYYYYYwYYYYYwYYYYYYyYYYY9YYYY=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYr   c                  2   t                               dddd          } d}| |k    }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          d	z  }d
d|iz  }t          t          j	        |                    d x}}t                               dddd          } d}| |k    }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          d	z  }d
d|iz  }t          t          j	        |                    d x}}t                               dddd          } d}| |k    }|st          j        d|fd| |f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          d	z  }d
d|iz  }t          t          j	        |                    d x}}t           j        }d}d}d}d} |||||          }	d}
|	|
k    }|st          j        d|fd|	|
f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          t          j        |          t          j        |          t          j        |          t          j        |	          t          j        |
          dz  }dd|iz  }t          t          j	        |                    d x}x}x}x}x}x}	x}}
d S )Nr         `@     o@皙?g     9@r   r   levelr   r   r   g      ^@g     Y@g      $@zp%(py12)s
{%(py12)s = %(py2)s
{%(py2)s = %(py0)s.ramp_toward
}(%(py4)s, %(py6)s, %(py8)s, %(py10)s)
} == %(py15)sr   r   r   rq   r   r   r;   r   r   assert %(py17)spy17
r   ramp_towardr   r    r!   r"   r#   r$   r%   r&   )r   r   r(   r   r   rv   rw   @py_assert7r@   r,   @py_assert14@py_assert13r   @py_format18s                 r   (test_ramp_toward_rises_and_falls_boundedr      s   ""3uc::E5D=5D55D""5%<<E5E>5E55E""5#uc::E5E>5E55E!?$??U?C?!!$UC88?C?8C??????????8C????????????:?????:??????!????$????????U????C????8????C???????????????????????????????????????r   c                     t           j        } d}d}d}d} | ||||          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |           t          j        |          t          j        |          t          j        |          t          j        |          t          j        |          t          j        |          dz  }dd	|iz  }	t          t          j	        |	                    d x} x}x}x}x}x}x}}d S )
Nr   r   r   r   r   r   r   r   r   r   )
r(   rv   rw   r   r@   r,   r   r   r   r   s
             r   !test_ramp_toward_stable_at_targetr      sy   !D%DDDsD!!%s;;DuD;uDDDDDDDDDD;uDDDDDDDDDDDD:DDDDD:DDDDDD!DDDD%DDDDDDDDDDDDsDDDD;DDDDuDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDr   c                    t          j        dddd           t          j        } |            }d}||u }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          d	z  }d
d|iz  }t          t	          j        |                    d x}x}x}}t          j        dddd           t          j        } |            }d}||u }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          d	z  }d
d|iz  }t          t	          j        |                    d x}x}x}}d S )Nr`   rD   Tg      >@)darkbrightness_pctr7   zN%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.lumen_says_dark
}()
} is %(py7)sr   rp   rr   r   Fr   )r   rG   r   lumen_says_darkr   r    r!   r"   r#   r$   r%   r&   r?   r(   rv   r*   rw   rx   ry   s          r   $test_lumen_says_dark_reads_live_flagr      sF   '94MMMM%/%%''/4/'4//////////'4////////////://///://////%////'////4/////////////////////////////'95MMMM%0%%''050'50000000000'5000000000000:00000:000000%0000'000050000000000000000000000000000000r   c                    t           j        } |            }d}||u }|st          j        d|fd||f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}x}}d S )NTr7   r   r   rp   rr   r   )
r   r   r   r    r!   r"   r#   r$   r%   r&   r   s          r   /test_lumen_says_dark_defaults_dark_when_no_datar      s    %/%%''/4/'4//////////'4////////////://///://////%////'////4///////////////////////////////r   c                    dd l }t          j        ddd           t          j        d          }|dxx         dz  cc<   | d         d	z                      |                    |                     t          j        } |            }d}||u }|st          j	        d
|fd||f          dt          j                    v st          j        t                    rt          j        t                    ndt          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j        |                    d x}x}x}}d S )Nr   r`   rD   Fr   last_updateZ   	state_dirz
lumen.jsonr7   r   r   rp   rr   r   )jsonr   rG   
read_state
write_textdumpsr   r   r   r    r!   r"   r#   r$   r%   r&   )	r?   r   stater(   rv   r*   rw   rx   ry   s	            r   -test_lumen_says_dark_tolerates_lumen_60s_pollr      s   KKK '959999 ))E	-B[L(44TZZ5F5FGGG%0%%''050'50000000000'5000000000000:00000:000000%0000'000050000000000000000000000000000000r   c           	      B   t          j        ddd           t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        ddd           t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}t          j        }d}d} |||          }d}||u }|st	          j        d|fd	||f          d
t          j                    v st	          j        t                    rt	          j	        t                    nd
t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          t	          j	        |          dz  }dd|iz  }t          t	          j        |                    d x}x}x}x}x}}d S )Nr`   rD   Tr   nightF)	confirmedr7   )zk%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.ring_should_light
}(%(py4)s, confirmed=%(py6)s)
} is %(py11)sr   r   r   rq   r   r   py11assert %(py13)sr   night_and_recording	recordingalwaysoff)r   rG   r   ring_should_lightr   r    r!   r"   r#   r$   r%   r&   )	r?   r(   rv   rw   r   r-   r@   @py_format12r   s	            r   test_ring_mode_policiesr      s6
   '948888'II5I''5AAAITIATIIIIIIIIIIATIIIIIIIIIIII:IIIII:IIIIII'IIIIIIII5IIIIAIIIITIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'X(=XX''(=OOOXSXXOSXXXXXXXXXXXOSXXXXXXXXXXXXX:XXXXX:XXXXXX'XXXX(=XXXXXXXXOXXXXSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'V(=VV''(=NNNVRVVNRVVVVVVVVVVVNRVVVVVVVVVVVVV:VVVVV:VVVVVV'VVVV(=VVVVVVVVNVVVVRVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'959999'II4I''4@@@IEI@EIIIIIIIIII@EIIIIIIIIIIII:IIIII:IIIIII'IIIIIIII4IIII@IIIIEIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'LLtL''tDDDLLDLLLLLLLLLLDLLLLLLLLLLLL:LLLLL:LLLLLL'LLLLLLLLtLLLLDLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL'NNuN''uEEENNENNNNNNNNNNENNNNNNNNNNNN:NNNNN:NNNNNN'NNNNNNNNuNNNNENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'JJEJ''EBBBJdJBdJJJJJJJJJJBdJJJJJJJJJJJJ:JJJJJ:JJJJJJ'JJJJJJJJEJJJJBJJJJdJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'GGG''>>>G%G>%GGGGGGGGGG>%GGGGGGGGGGGG:GGGGG:GGGGGG'GGGGGGGGGGGG>GGGG%GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGr   c                     ddl m}  d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}d
} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}d} | |          }d}||k    }|st          j        d|fd||f          dt	          j                    v st          j        |           rt          j        |           ndt          j        |          t          j        |          t          j        |          dz  }dd	|iz  }t          t          j	        |                    d x}x}x}}d S )Nr   )rpi_ws281x_channel_for   r   ro   r   rp   rr   r               )
ru   r   r   r    r!   r"   r#   r$   r%   r&   )r   r(   rv   r*   rw   rx   ry   s          r   test_rpi_ws281x_channel_by_pinr      s.   AAAAAA"$*!!"%%**%**********%************!*****!******"****%*********************************"$*!!"%%**%**********%************!*****!******"****%*********************************"$*!!"%%**%**********%************!*****!******"****%*********************************"$*!!"%%**%**********%************!*****!******"****%***********************************r   c            	         ddl m}  dd l}d|j        d<   d}d} | ||          }|j        }d}||k    }|st          j        d|fd	||f          d
t          j                    v st          j	        |           rt          j
        |           nd
t          j
        |          t          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}d}d} | ||          }|j        }d}||k    }|st          j        d|fd	||f          d
t          j                    v st          j	        |           rt          j
        |           nd
t          j
        |          t          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}d}d} | ||          }|j        }d}||k    }|st          j        d|fd	||f          d
t          j                    v st          j	        |           rt          j
        |           nd
t          j
        |          t          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}d}d} | ||          }|j        }d}||k    }|st          j        d|fd	||f          d
t          j                    v st          j	        |           rt          j
        |           nd
t          j
        |          t          j
        |          t          j
        |          t          j
        |          t          j
        |          dz  }dd|iz  }	t          t          j        |	                    d x}x}x}x}x}}d S )Nr   	StatusLED1BUBBLECAM_SIM)   first)	led_countindicator_positionr   )z}%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py0)s(led_count=%(py2)s, indicator_position=%(py4)s)
}._indicator_index
} == %(py11)sr   r   r   r   last(   r   )ru   r   osenviron_indicator_indexr   r    r!   r"   r#   r$   r%   r&   )
r   r   r(   rv   rw   r   r-   r@   r   r   s
             r    test_indicator_index_by_positionr      s3   444444III"%BJ!TgT99rg>>>T>OTSTTOSTTTTTTTTTTTOSTTTTTTTTTTTTT9TTTTT9TTTTTTrTTTTgTTTT>TTTTOTTTTSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT!TfT99rf===T=NTRTTNRTTTTTTTTTTTNRTTTTTTTTTTTTT9TTTTT9TTTTTTrTTTTfTTTT=TTTTNTTTTRTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT SWS99qW===S=NSRSSNRSSSSSSSSSSSNRSSSSSSSSSSSSS9SSSSS9SSSSSSqSSSSWSSSS=SSSSNSSSSRSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS RVR99qV<<<R<MRQRRMQRRRRRRRRRRRMQRRRRRRRRRRRRR9RRRRR9RRRRRRqRRRRVRRRR<RRRRMRRRRQR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RRRRRRRRr   c                    ddl m}  |d          }|                    d           |                    d           |                    d           |                    d           |                                j        }|j        }d} ||          }d}||k    }	|	st          j        d	|	fd
||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}x}x}	}|j        }d} ||          }d}||k    }	|	st          j        d	|	fd
||f          dt          j
                    v st          j        |          rt          j        |          ndt          j        |          t          j        |          t          j        |          t          j        |          dz  }
dd|
iz  }t          t          j        |                    d x}x}x}x}	}d S )Nr   r   r   )r   rm   )   r   r   zstatus -> (255, 0, 0)r   r   )zK%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py4)s)
} == %(py9)sout)r   r   rq   r   r   zassert %(py11)sr   zring -> (128, 128, 128))ru   r   set_status_colorset_ring_color
readouterrr   countr   r    r!   r"   r#   r$   r%   r&   )r?   capsysr   ledr   r(   rv   rw   r+   r   ry   r   s               r   1test_status_led_zones_are_independent_and_dedupedr      s   444444
)b
!
!
!C%%%%%%''''''





!C92,299,--22-2222222222-222222222222322222322222292222,2222-2222222222222222222222222222222222294.499.//414/14444444444/1444444444444344444344444494444.4444/44441444444444444444444444444444444444r   c                    t           j        } |            }d }||u }|st          j        d|fd||f          dt	          j                    v st          j        t                     rt          j        t                     ndt          j        |          t          j        |          t          j        |          dz  }dd|iz  }t          t          j	        |                    d x}x}x}}d S )Nr7   )zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.recover_confirmed_at
}()
} is %(py7)sr   rp   rr   r   )
r   recover_confirmed_atr   r    r!   r"   r#   r$   r%   r&   r   s          r   2test_recover_confirmed_at_none_when_no_prior_stater     s   *4**,,44,4444444444,444444444444:44444:444444*4444,44444444444444444444444444444444444r   c                    t          j        ddd           t          j        } |            }d}||k    }|st	          j        d|fd||f          dt          j                    v st	          j        t                    rt	          j	        t                    ndt	          j	        |          t	          j	        |          t	          j	        |          dz  }d	d
|iz  }t          t	          j        |                    d x}x}x}}d S )Nr   r   g    @)confirmed_atr   )zS%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.recover_confirmed_at
}()
} == %(py7)sr   rp   rr   r   )r   rG   r   r   r   r    r!   r"   r#   r$   r%   r&   r   s          r   3test_recover_confirmed_at_reads_back_own_last_stater     s%   %w????*7**,,77,7777777777,777777777777:77777:777777*7777,77777777777777777777777777777777777r   )r   )'builtinsr!   _pytest.assertion.rewrite	assertionrewriter   	bubblecamr   conftestr   r   r   r0   r5   rB   rH   rJ   rN   rW   r]   ra   rf   rh   rj   rz   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
   r   r   <module>r     s3                       $ $ $ $ $ $_\**
& & & &S S Se e e: : :9 9 9: : :
J J JQ Q QP P PQ Q QQ Q QP P PP P P1 1 1  D D D Z Z Z@ @ @E E E1 1 10 0 0	1 	1 	1H H H+ + +	S 	S 	S
5 
5 
55 5 58 8 8 8 8r   