==================================================== TDD: SeparacaoWmsStrategy — ordenação por endereço WMS ==================================================== --- 1. Cenário: Herança --- ✅ [PASS] SeparacaoWmsStrategy estende SeparacaoExecucaoStrategy ✅ [PASS] SeparacaoWmsStrategy estende BaseExecucaoStrategy (via SeparacaoExecucaoStrategy) --- 2. Cenário: Ordena por código do endereço (natural sort) --- ✅ [PASS] Natural sort: A01-P1-N1, A03-P2-N2, A03-P2-N10 (não string sort puro) --- 3. Cenário: Itens 'legado' sempre ao FIM, agrupados (AC4.2) --- ✅ [PASS] wms (por endereço) primeiro, legado (por nome) ao fim, sem intercalar --- 4. Cenário: Ausência de origem_localizacao trata como legado (default seguro) --- ✅ [PASS] Item sem origem_localizacao cai no grupo legado (fim) --- 5. Cenário: Desempate por nome A-Z quando endereço é igual --- ✅ [PASS] Mesmo endereço -> desempate alfabético (Abacaxi antes de Zebra) --- 6. Cenário: Desempate final por id ASC --- ✅ [PASS] Endereço e nome iguais -> desempate por id ASC --- 7. Cenário: dados_adicionais como STRING JSON crua (fetch sem decode) --- ✅ [PASS] Decodifica dados_adicionais em string JSON corretamente antes de ordenar --- 8. Cenário: candidatos como array associativo (não stdClass) --- ✅ [PASS] Formato array associativo também é suportado (painel vs execução híbrida) --- 9. Cenário: aplicarSequenciamento (Painel) e ordenarCandidatosParaExecucao (Execução) concordam --- ✅ [PASS] Sequenciamento visual (Painel) usa exatamente os mesmos critérios da fila de Execução (nenhum item pulado nesse conjunto) --- 10. Cenário: ordenarCandidatosParaExecucao() (pipeline público, hot path) --- ✅ [PASS] Pipeline completo: wms por endereço, legado no fim, pulado por último (finalizarOrdenacao) --- 11. Cenário: candidatos vazio -> retorna [] sem erro --- ✅ [PASS] Lista vazia não quebra o pipeline ==================================================== RESULTADO GERAL: ✅ SUCESSO Passou: 12 Falhou: 0 ====================================================