Fixed the upb.lexan build:

- Fixed a couple of broken tests that were probably invoking UB.
- Excluded python/... and js/..., as these do not work with Windows.

PiperOrigin-RevId: 525228589
diff --git a/BUILD b/BUILD
index e421be7..045ded0 100644
--- a/BUILD
+++ b/BUILD
@@ -682,11 +682,6 @@
         "upb/reflection/def_builder_test.cc",
         "upb/reflection/def_type.h",
     ],
-    # TODO(b/259158612): fix this test on Windows.
-    target_compatible_with = select({
-        "@platforms//os:windows": ["@platforms//:incompatible"],
-        "//conditions:default": [],
-    }),
     deps = [
         ":descriptor_upb_proto",
         ":hash",
@@ -694,6 +689,7 @@
         ":reflection",
         ":reflection_internal",
         ":upb",
+        "@com_google_absl//absl/strings",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/upb/reflection/def_builder_test.cc b/upb/reflection/def_builder_test.cc
index b57ae28..1166dd2 100644
--- a/upb/reflection/def_builder_test.cc
+++ b/upb/reflection/def_builder_test.cc
@@ -26,33 +26,21 @@
  */
 
 #include "gtest/gtest.h"
-#include "upb/reflection/def.hpp"
+#include "absl/strings/string_view.h"
 #include "upb/reflection/def_builder_internal.h"
+#include "upb/upb.hpp"
 
 // Must be last.
 #include "upb/port/def.inc"
 
-struct IdentTest {
-  const char* text;
+struct IdentTestData {
+  absl::string_view text;
   bool ok;
 };
 
-static const std::vector<IdentTest> FullIdentTests = {
-    {"foo.bar", true},   {"foo.", true},  {"foo", true},
+class FullIdentTestBase : public testing::TestWithParam<IdentTestData> {};
 
-    {"foo.7bar", false}, {".foo", false}, {"#", false},
-    {".", false},        {"", false},
-};
-
-static const std::vector<IdentTest> NotFullIdentTests = {
-    {"foo", true},      {"foo1", true},
-
-    {"foo.bar", false}, {"1foo", false}, {"#", false},
-    {".", false},       {"", false},
-};
-
-TEST(DefBuilder, TestIdents) {
-  upb_StringView sv;
+TEST_P(FullIdentTestBase, CheckFullIdent) {
   upb_Status status;
   upb_DefBuilder ctx;
   upb::Arena arena;
@@ -60,27 +48,56 @@
   ctx.arena = arena.ptr();
   upb_Status_Clear(&status);
 
-  for (const auto& test : FullIdentTests) {
-    sv.data = test.text;
-    sv.size = strlen(test.text);
-
-    if (UPB_SETJMP(ctx.err)) {
-      EXPECT_FALSE(test.ok);
-    } else {
-      _upb_DefBuilder_CheckIdentFull(&ctx, sv);
-      EXPECT_TRUE(test.ok);
-    }
-  }
-
-  for (const auto& test : NotFullIdentTests) {
-    sv.data = test.text;
-    sv.size = strlen(test.text);
-
-    if (UPB_SETJMP(ctx.err)) {
-      EXPECT_FALSE(test.ok);
-    } else {
-      _upb_DefBuilder_MakeFullName(&ctx, "abc", sv);
-      EXPECT_TRUE(test.ok);
-    }
+  if (UPB_SETJMP(ctx.err)) {
+    EXPECT_FALSE(GetParam().ok);
+  } else {
+    _upb_DefBuilder_CheckIdentFull(
+        &ctx, upb_StringView_FromDataAndSize(GetParam().text.data(),
+                                             GetParam().text.size()));
+    EXPECT_TRUE(GetParam().ok);
   }
 }
+
+INSTANTIATE_TEST_SUITE_P(FullIdentTest, FullIdentTestBase,
+                         testing::ValuesIn(std::vector<IdentTestData>{
+                             {"foo.bar", true},
+                             {"foo.", true},
+                             {"foo", true},
+
+                             {"foo.7bar", false},
+                             {".foo", false},
+                             {"#", false},
+                             {".", false},
+                             {"", false}}));
+
+class PartIdentTestBase : public testing::TestWithParam<IdentTestData> {};
+
+TEST_P(PartIdentTestBase, TestNotFullIdent) {
+  upb_Status status;
+  upb_DefBuilder ctx;
+  upb::Arena arena;
+  ctx.status = &status;
+  ctx.arena = arena.ptr();
+  upb_Status_Clear(&status);
+
+  if (UPB_SETJMP(ctx.err)) {
+    EXPECT_FALSE(GetParam().ok);
+  } else {
+    _upb_DefBuilder_MakeFullName(
+        &ctx, "abc",
+        upb_StringView_FromDataAndSize(GetParam().text.data(),
+                                       GetParam().text.size()));
+    EXPECT_TRUE(GetParam().ok);
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(PartIdentTest, PartIdentTestBase,
+                         testing::ValuesIn(std::vector<IdentTestData>{
+                             {"foo", true},
+                             {"foo1", true},
+
+                             {"foo.bar", false},
+                             {"1foo", false},
+                             {"#", false},
+                             {".", false},
+                             {"", false}}));
diff --git a/upb/util/BUILD b/upb/util/BUILD
index 5c5a7ee..7948bcf 100644
--- a/upb/util/BUILD
+++ b/upb/util/BUILD
@@ -151,11 +151,6 @@
 cc_test(
     name = "compare_test",
     srcs = ["compare_test.cc"],
-    # TODO(b/259158757): fix this test on Windows.
-    target_compatible_with = select({
-        "@platforms//os:windows": ["@platforms//:incompatible"],
-        "//conditions:default": [],
-    }),
     deps = [
         ":compare",
         "//:wire_internal",
diff --git a/upb/util/compare_test.cc b/upb/util/compare_test.cc
index 25e7b2d..e168f70 100644
--- a/upb/util/compare_test.cc
+++ b/upb/util/compare_test.cc
@@ -29,12 +29,12 @@
 
 #include <stdint.h>
 
-#include <string_view>
+#include <initializer_list>
+#include <string>
+#include <variant>
 #include <vector>
 
-#include "gmock/gmock.h"
 #include "gtest/gtest.h"
-#include "absl/strings/string_view.h"
 #include "upb/wire/swap_internal.h"
 #include "upb/wire/types.h"
 
@@ -42,70 +42,36 @@
 
 using UnknownFields = std::vector<UnknownField>;
 
-enum class UnknownFieldType {
-  kVarint,
-  kLongVarint,  // Over-encoded to have distinct wire format.
-  kDelimited,
-  kFixed64,
-  kFixed32,
-  kGroup,
+struct Varint {
+  explicit Varint(uint64_t _val) : val(_val) {}
+  uint64_t val;
 };
-
-union UnknownFieldValue {
-  uint64_t varint;
-  uint64_t fixed64;
-  uint32_t fixed32;
-  // NULL-terminated (strings must not have embedded NULL).
-  const char* delimited;
-  UnknownFields* group;
+struct LongVarint {
+  explicit LongVarint(uint64_t _val) : val(_val) {}
+  uint64_t val;  // Over-encoded.
 };
-
-struct TypeAndValue {
-  UnknownFieldType type;
-  UnknownFieldValue value;
+struct Delimited {
+  explicit Delimited(std::string _val) : val(_val) {}
+  std::string val;
+};
+struct Fixed64 {
+  explicit Fixed64(uint64_t _val) : val(_val) {}
+  uint64_t val;
+};
+struct Fixed32 {
+  explicit Fixed32(uint32_t _val) : val(_val) {}
+  uint32_t val;
+};
+struct Group {
+  Group(std::initializer_list<UnknownField> _val) : val(_val) {}
+  UnknownFields val;
 };
 
 struct UnknownField {
   uint32_t field_number;
-  TypeAndValue value;
+  std::variant<Varint, LongVarint, Delimited, Fixed64, Fixed32, Group> value;
 };
 
-TypeAndValue Varint(uint64_t val) {
-  TypeAndValue ret{UnknownFieldType::kVarint};
-  ret.value.varint = val;
-  return ret;
-}
-
-TypeAndValue LongVarint(uint64_t val) {
-  TypeAndValue ret{UnknownFieldType::kLongVarint};
-  ret.value.varint = val;
-  return ret;
-}
-
-TypeAndValue Fixed64(uint64_t val) {
-  TypeAndValue ret{UnknownFieldType::kFixed64};
-  ret.value.fixed64 = val;
-  return ret;
-}
-
-TypeAndValue Fixed32(uint32_t val) {
-  TypeAndValue ret{UnknownFieldType::kFixed32};
-  ret.value.fixed32 = val;
-  return ret;
-}
-
-TypeAndValue Delimited(const char* val) {
-  TypeAndValue ret{UnknownFieldType::kDelimited};
-  ret.value.delimited = val;
-  return ret;
-}
-
-TypeAndValue Group(UnknownFields nested) {
-  TypeAndValue ret{UnknownFieldType::kGroup};
-  ret.value.group = &nested;
-  return ret;
-}
-
 void EncodeVarint(uint64_t val, std::string* str) {
   do {
     char byte = val & 0x7fU;
@@ -116,45 +82,33 @@
 }
 
 std::string ToBinaryPayload(const UnknownFields& fields) {
-  static const upb_WireType wire_types[] = {
-      kUpb_WireType_Varint, kUpb_WireType_Varint, kUpb_WireType_Delimited,
-      kUpb_WireType_64Bit,  kUpb_WireType_32Bit,  kUpb_WireType_StartGroup,
-  };
   std::string ret;
 
   for (const auto& field : fields) {
-    uint32_t tag = field.field_number << 3 |
-                   (wire_types[static_cast<int>(field.value.type)]);
-    EncodeVarint(tag, &ret);
-    switch (field.value.type) {
-      case UnknownFieldType::kVarint:
-        EncodeVarint(field.value.value.varint, &ret);
-        break;
-      case UnknownFieldType::kLongVarint:
-        EncodeVarint(field.value.value.varint, &ret);
-        ret.back() |= 0x80;
-        ret.push_back(0);
-        break;
-      case UnknownFieldType::kDelimited:
-        EncodeVarint(strlen(field.value.value.delimited), &ret);
-        ret.append(field.value.value.delimited);
-        break;
-      case UnknownFieldType::kFixed64: {
-        uint64_t val = _upb_BigEndian_Swap64(field.value.value.fixed64);
-        ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
-        break;
-      }
-      case UnknownFieldType::kFixed32: {
-        uint32_t val = _upb_BigEndian_Swap32(field.value.value.fixed32);
-        ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
-        break;
-      }
-      case UnknownFieldType::kGroup: {
-        uint32_t end_tag = field.field_number << 3 | kUpb_WireType_EndGroup;
-        ret.append(ToBinaryPayload(*field.value.value.group));
-        EncodeVarint(end_tag, &ret);
-        break;
-      }
+    if (const auto* val = std::get_if<Varint>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_Varint, &ret);
+      EncodeVarint(val->val, &ret);
+    } else if (const auto* val = std::get_if<LongVarint>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_Varint, &ret);
+      EncodeVarint(val->val, &ret);
+      ret.back() |= 0x80;
+      ret.push_back(0);
+    } else if (const auto* val = std::get_if<Delimited>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_Delimited, &ret);
+      EncodeVarint(val->val.size(), &ret);
+      ret.append(val->val);
+    } else if (const auto* val = std::get_if<Fixed64>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_64Bit, &ret);
+      uint64_t swapped = _upb_BigEndian_Swap64(val->val);
+      ret.append(reinterpret_cast<const char*>(&swapped), sizeof(swapped));
+    } else if (const auto* val = std::get_if<Fixed32>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_32Bit, &ret);
+      uint32_t swapped = _upb_BigEndian_Swap32(val->val);
+      ret.append(reinterpret_cast<const char*>(&swapped), sizeof(swapped));
+    } else if (const auto* val = std::get_if<Group>(&field.value)) {
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_StartGroup, &ret);
+      ret.append(ToBinaryPayload(val->val));
+      EncodeVarint(field.field_number << 3 | kUpb_WireType_EndGroup, &ret);
     }
   }