using System;
using Bmaju.InnerMinmus.RingShadows;
class ReceiverRevisionTests
{
    static int count;
    static void Check(bool ok,string name) { if(!ok) throw new Exception(name);count++;Console.WriteLine("PASS "+name); }
    static void Main()
    {
        var receiver=new ReceiverRevision<object,string>();object a=new object(),b=new object(),c=new object();
        int builds=0;Exception error;
        Check(receiver.TryUpdate(a,m=>{builds++;return "map A";},out error) && error==null,"initial mesh accepted");
        Check(receiver.TryUpdate(a,m=>{throw new Exception();},out error) && builds==1,"unchanged mesh reuses UV map");
        Check(!receiver.TryUpdate(null,m=>"bad",out error) && error==null && ReferenceEquals(receiver.Geometry,a),"temporary missing mesh preserves last valid state");
        Check(!receiver.TryUpdate(b,m=>{throw new InvalidOperationException("unreadable during LOD swap");},out error) && error!=null,"unreadable replacement is recoverable");
        Check(ReferenceEquals(receiver.Geometry,a) && receiver.Lookup=="map A","failed rebuild cannot commit partial geometry");
        Check(receiver.TryUpdate(b,m=>"map B",out error) && receiver.Lookup=="map B" && ReferenceEquals(receiver.Geometry,b),"replacement recovers without restarting subsystem");
        Check(!receiver.TryUpdate(c,m=>null,out error) && ReferenceEquals(receiver.Geometry,b),"empty UV rebuild preserves last valid pair");
        var other=new ReceiverRevision<object,string>();
        receiver.TryUpdate(c,m=>{throw new ArrayTypeMismatchException();},out error);
        Check(other.TryUpdate(a,m=>"other body",out error) && receiver.Lookup=="map B","one receiver failure leaves other receiver independent");
        Check(receiver.TryUpdate(c,m=>"map C",out error) && error==null,"later valid native mesh restores affected receiver");
        Console.WriteLine("TOTAL "+count+" passed; managed mesh/UV state transitions, not Unity LOD rendering");
    }
}
