<commit_before>#!/usr/bin/env python
# encoding: utf-8

import os
import sys
import unittest

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

import pfp
import pfp.fields
import pfp.interp
import pfp.utils

import utils


class TestStructUnion(utils.PfpTestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
    
    def test_basic_struct(self):
        dom = self._test_parse_build(
            "\x00\x01\x02\x03",
            """
                struct SomeStruct {
                    byte a;
                    byte b;
                    byte c;
                    byte d;
                };
                struct SomeStruct test;
            """
        )
        assert dom.test.a == 0
        assert dom.test.b == 1
        assert dom.test.c == 2
        assert dom.test.d == 3

    def test_field_path(self):
        dom = self._test_parse_build(
            "Abbbb4141414142424242",
            """
                struct {
                    struct {
                        struct {
                            char inner;
                            char array[4];
                        } nested2;
                        int some_int;
                    } nested1;
                    int some_int2;
                } root;
            """,
        )
        self.assertEqual(dom.root._pfp__path(), "root")
        self.assertEqual(dom.root.some_int2._pfp__path(), "root.some_int2")
        self.assertEqual(dom.root.nested1._pfp__path(), "root.nested1")
        self.assertEqual(dom.root.nested1.some_int._pfp__path(), "root.nested1.some_int")
        self.assertEqual(dom.root.nested1.nested2._pfp__path(), "root.nested1.nested2")
        self.assertEqual(dom.root.nested1.nested2.inner._pfp__path(), "root.nested1.nested2.inner")
        self.assertEqual(dom.root.nested1.nested2.array._pfp__path(), "root.nested1.nested2.array")
        self.assertEqual(dom.root.nested1.nested2.array[0]._pfp__path(), "root.nested1.nested2.array[0]")
        self.assertEqual(dom.root.nested1.nested2.array[1]._pfp__path(), "root.nested1.nested2.array[1]")
        self.assertEqual(dom.root.nested1.nested2.array[2]._pfp__path(), "root.nested1.nested2.array[2]")
        self.assertEqual(dom.root.nested1.nested2.array[3]._pfp__path(), "root.nested1.nested2.array[3]")
    
    def test_struct(self):
        dom = self._test_parse_build(
            "abcddcba",
            """
                typedef struct {
                    int some_int;
                } blah;

                blah some_struct;
                blah some_struct2;
            """,
        )
    
    def test_forward_declared_struct(self):
        dom = self._test_parse_build(
            "\x00\x01",
            """
                struct fp16;
                void ReadFP16(fp16& f)
                {
                    Printf("%d", f.value);
                }
                typedef struct
                {
                    int16 value;
                } fp16;
                fp16 preferred_volume;
                ReadFP16(preferred_volume);
            """,
            stdout="256",
        )<commit_msg>Forgot to explicitly set endianness in test<commit_after>#!/usr/bin/env python
# encoding: utf-8

import os
import sys
import unittest

sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))

import pfp
import pfp.fields
import pfp.interp
import pfp.utils

import utils


class TestStructUnion(utils.PfpTestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass
    
    def test_basic_struct(self):
        dom = self._test_parse_build(
            "\x00\x01\x02\x03",
            """
                struct SomeStruct {
                    byte a;
                    byte b;
                    byte c;
                    byte d;
                };
                struct SomeStruct test;
            """
        )
        assert dom.test.a == 0
        assert dom.test.b == 1
        assert dom.test.c == 2
        assert dom.test.d == 3

    def test_field_path(self):
        dom = self._test_parse_build(
            "Abbbb4141414142424242",
            """
                struct {
                    struct {
                        struct {
                            char inner;
                            char array[4];
                        } nested2;
                        int some_int;
                    } nested1;
                    int some_int2;
                } root;
            """,
        )
        self.assertEqual(dom.root._pfp__path(), "root")
        self.assertEqual(dom.root.some_int2._pfp__path(), "root.some_int2")
        self.assertEqual(dom.root.nested1._pfp__path(), "root.nested1")
        self.assertEqual(dom.root.nested1.some_int._pfp__path(), "root.nested1.some_int")
        self.assertEqual(dom.root.nested1.nested2._pfp__path(), "root.nested1.nested2")
        self.assertEqual(dom.root.nested1.nested2.inner._pfp__path(), "root.nested1.nested2.inner")
        self.assertEqual(dom.root.nested1.nested2.array._pfp__path(), "root.nested1.nested2.array")
        self.assertEqual(dom.root.nested1.nested2.array[0]._pfp__path(), "root.nested1.nested2.array[0]")
        self.assertEqual(dom.root.nested1.nested2.array[1]._pfp__path(), "root.nested1.nested2.array[1]")
        self.assertEqual(dom.root.nested1.nested2.array[2]._pfp__path(), "root.nested1.nested2.array[2]")
        self.assertEqual(dom.root.nested1.nested2.array[3]._pfp__path(), "root.nested1.nested2.array[3]")
    
    def test_struct(self):
        dom = self._test_parse_build(
            "abcddcba",
            """
                typedef struct {
                    int some_int;
                } blah;

                blah some_struct;
                blah some_struct2;
            """,
        )
    
    def test_forward_declared_struct(self):
        dom = self._test_parse_build(
            "\x00\x01",
            """
                LittleEndian();
                struct fp16;
                void ReadFP16(fp16& f)
                {
                    Printf("%d", f.value);
                }
                typedef struct
                {
                    int16 value;
                } fp16;
                fp16 preferred_volume;
                ReadFP16(preferred_volume);
            """,
            stdout="256",
        )
{'fraction_non_alphanumeric': 0.11364350833071361, 'fraction_numerical': 0.030807922037095252, 'mean_word_length': 1.412054586808188, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7218729', 'n_tokens_mistral': 1982, 'n_tokens_neox': 1848, 'n_words': 279}