| import torch |
|
|
| from agroscan.classifier import AgroScanClassifier |
| from agroscan.data_loader import DataBundle |
|
|
|
|
| class FakeModel: |
| def encode(self, texts, convert_to_tensor=True, normalize_embeddings=True): |
| if isinstance(texts, list): |
| vectors = [self._to_vec(t) for t in texts] |
| return torch.stack(vectors) |
| return self._to_vec(texts) |
|
|
| def _to_vec(self, text): |
| t = str(text).lower() |
| if "solo" in t: |
| return torch.tensor([1.0, 0.0]) |
| if "lagarta" in t: |
| return torch.tensor([0.0, 1.0]) |
| return torch.tensor([0.7, 0.7]) |
|
|
|
|
| def test_diagnostico_e_tratamento_retorna_campos_esperados(): |
| import pandas as pd |
|
|
| df_base = pd.DataFrame({"DIAGNÓSTICO": ["Pragas do Solo", "Lagartas"]}) |
| df_trat = pd.DataFrame( |
| { |
| "Categoria da Praga": ["Pragas do Solo", "Lagartas"], |
| "Tratamento Nível 1 (Orgânico)": ["Org Solo", "Org Lag"], |
| "Tratamento Nível 2 (Genérico)": ["Gen Solo", "Gen Lag"], |
| "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Solo", "Agr Lag"], |
| } |
| ) |
|
|
| bundle = DataBundle( |
| df_base=df_base, |
| df_culturas_pragas=df_trat, |
| diag_base_col="DIAGNÓSTICO", |
| diag_trat_col="Categoria da Praga", |
| trat1_col="Tratamento Nível 1 (Orgânico)", |
| trat2_col="Tratamento Nível 2 (Genérico)", |
| trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)", |
| ) |
|
|
| clf = AgroScanClassifier(data=bundle, model=FakeModel()) |
| out = clf.diagnostico_e_tratamento(["solo seco", "raiz roida"]) |
|
|
| assert out["diagnostico"] == "Pragas do Solo" |
| assert out["tratamento_nivel_1"] == "Org Solo" |
| assert out["tratamento_nivel_2"] == "Gen Solo" |
| assert out["tratamento_nivel_3"] == "Agr Solo" |
|
|
|
|
| def test_diagnostico_e_tratamento_faz_fallback_semantico_categoria(): |
| import pandas as pd |
|
|
| |
| df_base = pd.DataFrame({"DIAGNÓSTICO": ["Pragas de Solo", "Lagartas"]}) |
| df_trat = pd.DataFrame( |
| { |
| "Categoria da Praga": ["Pragas do Solo", "Lagartas"], |
| "Tratamento Nível 1 (Orgânico)": ["Org Solo", "Org Lag"], |
| "Tratamento Nível 2 (Genérico)": ["Gen Solo", "Gen Lag"], |
| "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Solo", "Agr Lag"], |
| } |
| ) |
|
|
| bundle = DataBundle( |
| df_base=df_base, |
| df_culturas_pragas=df_trat, |
| diag_base_col="DIAGNÓSTICO", |
| diag_trat_col="Categoria da Praga", |
| trat1_col="Tratamento Nível 1 (Orgânico)", |
| trat2_col="Tratamento Nível 2 (Genérico)", |
| trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)", |
| ) |
|
|
| clf = AgroScanClassifier(data=bundle, model=FakeModel()) |
| out = clf.diagnostico_e_tratamento(["solo seco", "raiz roida"]) |
|
|
| assert out["diagnostico"] == "Pragas de Solo" |
| assert out["tratamento_nivel_1"] == "Org Solo" |
| assert out["tratamento_nivel_2"] == "Gen Solo" |
| assert out["tratamento_nivel_3"] == "Agr Solo" |
|
|
|
|
| def test_match_estruturado_prioriza_linha_exata_da_base(): |
| import pandas as pd |
|
|
| df_base = pd.DataFrame( |
| { |
| "Municipio": ["Boa Vista", "Alto Alegre"], |
| "Porte": ["Pequeno", "Medio"], |
| "Cultura": ["Mandioca", "Milho"], |
| "Sintoma": ["Folhas amareladas e murcha inicial", "Folhas amareladas e com buracos"], |
| "DIAGNÓSTICO": ["Percevejo", "Lagarta-do-cartucho"], |
| } |
| ) |
| df_trat = pd.DataFrame( |
| { |
| "Categoria da Praga": ["Percevejo", "Lagarta-do-cartucho"], |
| "Tratamento Nível 1 (Orgânico)": ["Org Per", "Org Lag"], |
| "Tratamento Nível 2 (Genérico)": ["Gen Per", "Gen Lag"], |
| "Tratamento Nível 3 (Agrotóxico Controlado)": ["Agr Per", "Agr Lag"], |
| } |
| ) |
|
|
| bundle = DataBundle( |
| df_base=df_base, |
| df_culturas_pragas=df_trat, |
| diag_base_col="DIAGNÓSTICO", |
| diag_trat_col="Categoria da Praga", |
| trat1_col="Tratamento Nível 1 (Orgânico)", |
| trat2_col="Tratamento Nível 2 (Genérico)", |
| trat3_col="Tratamento Nível 3 (Agrotóxico Controlado)", |
| ) |
|
|
| clf = AgroScanClassifier(data=bundle, model=FakeModel()) |
| out = clf.diagnostico_e_tratamento( |
| ["Boa Vista", "Pequeno", "Mandioca", "Folhas amareladas e murcha inicial"] |
| ) |
|
|
| assert out["diagnostico"] == "Percevejo" |
| assert out["tratamento_nivel_1"] == "Org Per" |
|
|