#include "stm32g0xx.h"
#include "lamp_i2c_pins.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
GPIO_TypeDef b;RCC_TypeDef r;I2C_TypeDef i;
static void seed(unsigned ones){
 memset(&b,ones?255:0,sizeof b);memset(&r,0,sizeof r);memset(&i,0,sizeof i);b.LCKR=0;
}
int main(void){
 for(unsigned ones=0;ones<2;ones++){
 seed(ones);GPIO_TypeDef old=b;assert(lamp_i2c_pins_init());assert(lamp_i2c_pins_available());
 assert(i.CR1==0 && i.CR2==0 && i.TIMINGR==0);
 assert((b.MODER&~0x3ffc0u)==(old.MODER&~0x3ffc0u));
 assert((b.PUPDR&~0x3ffc0u)==(old.PUPDR&~0x3ffc0u));
 assert((b.OTYPER&~0xc0u)==(old.OTYPER&~0xc0u));
 assert(b.BSRR==0xc0u);assert((b.AFR[0]&0xff000000u)==0x66000000u);
 assert((b.AFR[1]&~15u)==(old.AFR[1]&~15u));
 /* GPIOB9 reset and PB0 key untouched, including latches. */
 assert(b.ODR==old.ODR);
 }
 for(unsigned pin=3;pin<=8;pin++){
 seed(0);b.LCKR=(1u<<16)|(1u<<pin);GPIO_TypeDef old=b;
 assert(!lamp_i2c_pins_init());assert(!lamp_i2c_pins_available());
 assert(memcmp(&b,&old,sizeof b)==0);
 }
 seed(0);i.CR1=I2C_CR1_PE;GPIO_TypeDef old=b;
 assert(!lamp_i2c_pins_init());assert(memcmp(&b,&old,sizeof b)==0);assert(i.CR1==I2C_CR1_PE);
 for(unsigned pin=3;pin<=8;pin++)for(unsigned mode=0;mode<4;mode++){
 seed(0);assert(lamp_i2c_pins_init());
 b.MODER=(b.MODER&~(3u<<(pin*2)))|(mode<<(pin*2));
 assert(lamp_i2c_pins_available()==(mode==((pin==6 || pin==7)?2u:3u)));
 }
 for(unsigned pin=3;pin<=8;pin++){
 seed(0);assert(lamp_i2c_pins_init());b.PUPDR|=1u<<(pin*2);assert(!lamp_i2c_pins_available());
 seed(0);assert(lamp_i2c_pins_init());b.AFR[pin/8]^=1u<<((pin%8)*4);assert(!lamp_i2c_pins_available());
 }
 for(unsigned pin=6;pin<=7;pin++){
 seed(0);assert(lamp_i2c_pins_init());b.OTYPER&=~(1u<<pin);assert(!lamp_i2c_pins_available());
 }
 seed(0);assert(lamp_i2c_pins_init());r.IOPENR=0;assert(!lamp_i2c_pins_available());
 seed(0);assert(lamp_i2c_pins_init());r.APBENR1=0;assert(!lamp_i2c_pins_available());
 puts("PASS actual pin initializer/runtime guard: AF6 mapping, alias modes, open-drain, active peripheral rejection, six locks, unrelated pins preserved, no PE/START/TIMING writes");
}
