<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
<coverage line-rate="0.9071" branch-rate="0.7083" lines-covered="127" lines-valid="140" branches-covered="17" branches-valid="24" complexity="32" version="2.1.1" timestamp="1786000462">
  <sources>
    <source>src</source>
  </sources>
  <packages>
    <package name="cart" line-rate="0.8831" branch-rate="0.7143" complexity="11">
      <classes>
        <class name="pricing" filename="src/cart/pricing.js" line-rate="0.9091" branch-rate="0.7500" complexity="6">
          <methods>
            <method name="unitPrice" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="2" hits="25"/></lines>
            </method>
            <method name="quantityMultiplier" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="8" hits="8"/></lines>
            </method>
            <method name="roundHalfUp" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="13" hits="9"/></lines>
            </method>
            <method name="applyTax" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="19" hits="37"/></lines>
            </method>
            <method name="bulkRate" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="25" hits="35"/></lines>
            </method>
            <method name="convertCurrency" signature="()V" line-rate="0.0" branch-rate="1.0">
              <lines><line number="31" hits="0"/></lines>
            </method>
          </methods>
          <lines>
            <line number="2" hits="13" branch="false"/>
            <line number="3" hits="21" branch="false"/>
            <line number="4" hits="23" branch="false"/>
            <line number="5" hits="10" branch="true" condition-coverage="100% (2/2)"/>
            <line number="6" hits="8" branch="false"/>
            <line number="8" hits="2" branch="false"/>
            <line number="9" hits="47" branch="false"/>
            <line number="10" hits="2" branch="false"/>
            <line number="11" hits="0" branch="false"/>
            <line number="12" hits="29" branch="false"/>
            <line number="13" hits="41" branch="false"/>
            <line number="15" hits="14" branch="true" condition-coverage="100% (2/2)"/>
            <line number="16" hits="36" branch="false"/>
            <line number="17" hits="40" branch="false"/>
            <line number="18" hits="5" branch="false"/>
            <line number="19" hits="33" branch="false"/>
            <line number="20" hits="0" branch="false"/>
            <line number="22" hits="47" branch="false"/>
            <line number="23" hits="18" branch="false"/>
            <line number="24" hits="29" branch="true" condition-coverage="50% (1/2)"/>
            <line number="25" hits="18" branch="false"/>
            <line number="26" hits="42" branch="false"/>
            <line number="27" hits="17" branch="false"/>
            <line number="29" hits="33" branch="false"/>
            <line number="30" hits="0" branch="false"/>
            <line number="31" hits="31" branch="false"/>
            <line number="32" hits="42" branch="false"/>
            <line number="33" hits="9" branch="true" condition-coverage="50% (1/2)"/>
            <line number="34" hits="13" branch="false"/>
            <line number="36" hits="45" branch="false"/>
            <line number="37" hits="16" branch="false"/>
            <line number="38" hits="20" branch="false"/>
            <line number="39" hits="0" branch="false"/>
            <line number="40" hits="18" branch="false"/>
            <line number="41" hits="24" branch="false"/>
            <line number="43" hits="15" branch="false"/>
            <line number="44" hits="30" branch="false"/>
            <line number="45" hits="33" branch="false"/>
            <line number="46" hits="16" branch="false"/>
            <line number="47" hits="9" branch="false"/>
            <line number="48" hits="46" branch="false"/>
            <line number="50" hits="15" branch="false"/>
            <line number="51" hits="15" branch="false"/>
            <line number="52" hits="2" branch="false"/>
          </lines>
        </class>
        <class name="discounts" filename="src/cart/discounts.js" line-rate="0.8485" branch-rate="0.6667" complexity="5">
          <methods>
            <method name="percentageDiscount" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="2" hits="30"/></lines>
            </method>
            <method name="stackDiscounts" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="8" hits="12"/></lines>
            </method>
            <method name="isCouponExpired" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="13" hits="31"/></lines>
            </method>
            <method name="loyaltyTier" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="19" hits="7"/></lines>
            </method>
            <method name="freeShippingThreshold" signature="()V" line-rate="0.0" branch-rate="1.0">
              <lines><line number="25" hits="0"/></lines>
            </method>
          </methods>
          <lines>
            <line number="2" hits="20" branch="false"/>
            <line number="3" hits="2" branch="false"/>
            <line number="4" hits="40" branch="false"/>
            <line number="5" hits="11" branch="true" condition-coverage="100% (2/2)"/>
            <line number="6" hits="29" branch="false"/>
            <line number="8" hits="0" branch="false"/>
            <line number="9" hits="8" branch="false"/>
            <line number="10" hits="29" branch="false"/>
            <line number="11" hits="5" branch="false"/>
            <line number="12" hits="25" branch="false"/>
            <line number="13" hits="0" branch="false"/>
            <line number="15" hits="7" branch="true" condition-coverage="50% (1/2)"/>
            <line number="16" hits="31" branch="false"/>
            <line number="17" hits="5" branch="false"/>
            <line number="18" hits="42" branch="false"/>
            <line number="19" hits="0" branch="false"/>
            <line number="20" hits="23" branch="false"/>
            <line number="22" hits="30" branch="false"/>
            <line number="23" hits="2" branch="false"/>
            <line number="24" hits="17" branch="true" condition-coverage="50% (1/2)"/>
            <line number="25" hits="0" branch="false"/>
            <line number="26" hits="42" branch="false"/>
            <line number="27" hits="14" branch="false"/>
            <line number="29" hits="42" branch="false"/>
            <line number="30" hits="22" branch="false"/>
            <line number="31" hits="0" branch="false"/>
            <line number="32" hits="40" branch="false"/>
            <line number="33" hits="44" branch="false"/>
            <line number="34" hits="12" branch="false"/>
            <line number="36" hits="30" branch="false"/>
            <line number="37" hits="33" branch="false"/>
            <line number="38" hits="5" branch="false"/>
            <line number="39" hits="27" branch="false"/>
          </lines>
        </class>
      </classes>
    </package>
    <package name="checkout" line-rate="0.9365" branch-rate="0.7000" complexity="9">
      <classes>
        <class name="session" filename="src/checkout/session.js" line-rate="0.9231" branch-rate="0.6667" complexity="6">
          <methods>
            <method name="createSession" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="2" hits="13"/></lines>
            </method>
            <method name="expireSession" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="8" hits="36"/></lines>
            </method>
            <method name="restoreCart" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="13" hits="26"/></lines>
            </method>
            <method name="rotateToken" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="19" hits="20"/></lines>
            </method>
            <method name="persistCart" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="25" hits="23"/></lines>
            </method>
            <method name="readSessionCookie" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="31" hits="8"/></lines>
            </method>
          </methods>
          <lines>
            <line number="2" hits="40" branch="false"/>
            <line number="3" hits="36" branch="false"/>
            <line number="4" hits="34" branch="false"/>
            <line number="5" hits="17" branch="true" condition-coverage="100% (2/2)"/>
            <line number="6" hits="27" branch="false"/>
            <line number="8" hits="7" branch="false"/>
            <line number="9" hits="2" branch="false"/>
            <line number="10" hits="27" branch="false"/>
            <line number="11" hits="45" branch="false"/>
            <line number="12" hits="0" branch="false"/>
            <line number="13" hits="15" branch="false"/>
            <line number="15" hits="45" branch="true" condition-coverage="50% (1/2)"/>
            <line number="16" hits="45" branch="false"/>
            <line number="17" hits="35" branch="false"/>
            <line number="18" hits="6" branch="false"/>
            <line number="19" hits="41" branch="false"/>
            <line number="20" hits="23" branch="false"/>
            <line number="22" hits="3" branch="false"/>
            <line number="23" hits="0" branch="false"/>
            <line number="24" hits="15" branch="true" condition-coverage="50% (1/2)"/>
            <line number="25" hits="33" branch="false"/>
            <line number="26" hits="39" branch="false"/>
            <line number="27" hits="6" branch="false"/>
            <line number="29" hits="27" branch="false"/>
            <line number="30" hits="42" branch="false"/>
            <line number="31" hits="29" branch="false"/>
            <line number="32" hits="32" branch="false"/>
            <line number="33" hits="0" branch="false"/>
            <line number="34" hits="9" branch="false"/>
            <line number="36" hits="5" branch="false"/>
            <line number="37" hits="6" branch="false"/>
            <line number="38" hits="13" branch="false"/>
            <line number="39" hits="46" branch="false"/>
            <line number="40" hits="7" branch="false"/>
            <line number="41" hits="41" branch="false"/>
            <line number="43" hits="32" branch="false"/>
            <line number="44" hits="26" branch="false"/>
            <line number="45" hits="22" branch="false"/>
            <line number="46" hits="11" branch="false"/>
          </lines>
        </class>
        <class name="receipt" filename="src/checkout/receipt.js" line-rate="0.9583" branch-rate="0.7500" complexity="3">
          <methods>
            <method name="renderTotals" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="2" hits="34"/></lines>
            </method>
            <method name="renderLineItems" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="8" hits="23"/></lines>
            </method>
            <method name="formatCurrency" signature="()V" line-rate="1.0" branch-rate="1.0">
              <lines><line number="13" hits="29"/></lines>
            </method>
          </methods>
          <lines>
            <line number="2" hits="35" branch="false"/>
            <line number="3" hits="11" branch="false"/>
            <line number="4" hits="12" branch="false"/>
            <line number="5" hits="37" branch="true" condition-coverage="100% (2/2)"/>
            <line number="6" hits="33" branch="false"/>
            <line number="8" hits="25" branch="false"/>
            <line number="9" hits="2" branch="false"/>
            <line number="10" hits="4" branch="false"/>
            <line number="11" hits="41" branch="false"/>
            <line number="12" hits="30" branch="false"/>
            <line number="13" hits="40" branch="false"/>
            <line number="15" hits="39" branch="true" condition-coverage="50% (1/2)"/>
            <line number="16" hits="0" branch="false"/>
            <line number="17" hits="24" branch="false"/>
            <line number="18" hits="41" branch="false"/>
            <line number="19" hits="29" branch="false"/>
            <line number="20" hits="25" branch="false"/>
            <line number="22" hits="27" branch="false"/>
            <line number="23" hits="47" branch="false"/>
            <line number="24" hits="39" branch="false"/>
            <line number="25" hits="43" branch="false"/>
            <line number="26" hits="28" branch="false"/>
            <line number="27" hits="13" branch="false"/>
            <line number="29" hits="42" branch="false"/>
          </lines>
        </class>
      </classes>
    </package>
  </packages>
</coverage>
